当我使用
绿色线条不应该可见,也不是图像的一部分。相反,它们被绘制在图像的后面,而图像应该覆盖它们。
如何以完全正确的大小绘制图像?
编辑:我使用与我传递给
编辑2:我使用
编辑3:这是我用来渲染图像的代码:
Graphics.DrawImage
绘制图像并将其绘制为比原始图像更大的尺寸时,它最终会变得有点太小。您可以在以下图片中看到这一点:![enter image description here](https://istack.dev59.com/stSNg.webp)
如何以完全正确的大小绘制图像?
编辑:我使用与我传递给
DrawImage
调用的矩形相同的矩形来绘制绿色部分,其尺寸完全符合图像应该有多大的实际尺寸。因此,我的值没有错误(我想)。编辑2:我使用
FillRectangle
绘制绿色矩形,因此不需要进行任何笔计算。此外,我记录了我为图像和绿色填充传递的矩形的值,这些值是正确的。只是图像出问题了。由于我此刻不在电脑旁边,所以稍后我会发布代码。编辑3:这是我用来渲染图像的代码:
// This is for zooming
public readonly float[] SCALES = { 0.05f, 0.1f, 0.125f, 0.25f, 0.333f, 0.5f, 0.667f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f, 3.5f, 4.0f, 4.5f, 5.0f, 6.0f, 7.0f, 8.0f, 10.0f, 12.0f, 15.0f, 20.0f, 30.0f, 36.0f };
private int scaleIndex = 8;
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
float ScaleFactor = SCALES[scaleIndex];
e.Graphics.InterpolationMode = ScaleFactor < 1 ? InterpolationMode.Bicubic : InterpolationMode.NearestNeighbor;
Image im = Properties.Resources.TSprite0;
for (int y = 0; y < TilesVertical; y++)
{
for (int x = 0; x < TilesHorizontal; x++)
{
float sx = im.Width * ScaleFactor;
float sy = im.Height * ScaleFactor;
Point p = new Point((int)(-scrollPosition.X + sx * x), (int)(-scrollPosition.Y + sy * y));
Size s = new Size((int)Math.Floor(sx), (int)Math.Floor(sy));
// The green rectangle in the background should be the same size as the image
e.Graphics.FillRectangle(Brushes.Lime, new Rectangle(p, s));
e.Graphics.DrawImage(im, new Rectangle(p, s), 0, 0, 16, 16, GraphicsUnit.Pixel);
}
}
im.Dispose();
}
编辑4:还要注意的是,这个图像似乎被裁剪在左侧和顶部,而不是调整大小。看看这张原始图像在Photoshop中放大后如何呈现,以及GDI+如何呈现:
FillRectangle
,所以我不使用笔。 - Jonas Kohl