首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用图像填充纹理刷,而不是瓷砖。

使用图像填充纹理刷,而不是瓷砖。
EN

Stack Overflow用户
提问于 2016-10-18 10:34:46
回答 1查看 2.5K关注 0票数 3

我有一个纹理刷,它使用特定的图像来使纹理显示如下:

代码语言:javascript
复制
Image image = new Bitmap("Untitled.png");
for (int i = 0; i < points.Count; i++)
{
    using (TextureBrush tbr = new TextureBrush(image))
    {
          tbr.RotateTransform(i * 4);
          var p = PointToClient(Cursor.Position);
          tbr.Transform = new Matrix(
          75.0f / 640.0f,
          0.0f,
          0.0f,
          75.0f / 480.0f,
          0.0f,
          0.0f);
          e.Graphics.FillEllipse(tbr, p.X - 50, p.Y - 50, 100, 100);
          Pen p3 = new Pen(tbr);
          e.Graphics.DrawEllipse(Pens.DeepSkyBlue, p.X - 50, p.Y - 50, 100, 100);
    }
}

这是它正在使用的图像:

结果是这样的:

我希望图像填充圆圈,使其看起来像(编辑的图像):

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-18 15:15:52

你需要用正确的数字进行缩放。

如果您想要一个大小=宽度*高度像素的图像来填充一个直径圆,您应该像这样缩放:

代码语言:javascript
复制
 int diameter = 100;
 Image image = new Bitmap(yourImage);
 float scaleX = 1f * diameter / image.Size.Width;
 float scaleY = 1f * diameter / image.Size.Height;

然而,请注意,您的TextureBrush将始终显示一个由您的图像制作的贴图。对于您的original question来说,这似乎是可以的,特别是当在尾部旋转图像以去除任何工件时。

但在这里,它可能根本不是你想要的。

如果你想要图像跟随鼠标,你需要画它。

下面是一个示例,它使用一个复选框来在贴图绘图之间切换。动画只使用一个框架:

代码语言:javascript
复制
    for (int i = 0; i < points.Count; i++)
    {
        using (TextureBrush tbr = new TextureBrush(image))
        {
            tbr.RotateTransform(i * 4);   // optional
            var p = PointToClient(Cursor.Position);
            tbr.Transform = new Matrix(
                scaleX,
                0.0f,
                0.0f,
                scaleY,
                0.0f,
                0.0f);
            // any tile mode will work, though not all the same way
            tbr.WrapMode = WrapMode.TileFlipXY;
            if (cbx_tileFunny.Checked)
                e.Graphics.FillEllipse(tbr, p.X - diameter/2, 
                                            p.Y - diameter/2, diameter, diameter);
            else
            {
               ((Bitmap)image).SetResolution(e.Graphics.DpiX, e.Graphics.DpiY);   // (**)
                e.Graphics.ScaleTransform(scaleX, scaleY);
                e.Graphics.DrawImage( image, (p.X - diameter/2) / scaleX,
                                             (p.Y - diameter/2 ) / scaleY);
                e.Graphics.ResetTransform();

            }
                /// ? Pen p3 = new Pen(tbr);
                e.Graphics.DrawEllipse(Pens.DeepSkyBlue, p.X - diameter/2,
                                       p.Y - diameter/2, diameter, diameter);
        }
    }

如果图像具有与屏幕不同的dpi设置,请注意这里需要额外的缩放(**)。

另外:虽然快速创建和处理钢笔和刷子通常是个好主意,但如果在创建笔刷和/或图像缓存(甚至是一系列笔刷和刷子)上付出了这么大的努力,海事组织( imo )似乎会更好。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40105910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档