c# - DrawImage 调整大小的图像太小
问题描述
当我使用Graphics.DrawImage
比原始图像更大的尺寸绘制图像时,它最终有点太小了。您可以在下图中看到这一点:
绿线不应该是可见的,并且不是图像的一部分。相反,它们被绘制在图像后面,图像应该覆盖它们。
如何绘制正确尺寸的图像?
编辑:我用传递给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+ 是如何渲染它的:
解决方案
缩放到 2 倍或更大时会出现此问题。
看起来整个问题是由错误的默认PixelOffsetMode引起的。
通过在渲染期间偏移像素,您可以以渲染速度为代价来提高渲染质量。
将其设置为
g.PixelOffsetMode = PixelOffsetMode.Half;
让它对我来说消失了。
将其设置为
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
也可以正常工作。
Default
,None
并HighSpeed
导致图像向左和向上渲染一点。
通常您还需要设置InterpolationMode.NearestNeighbor
.
推荐阅读
- javascript - 如何在猫鼬中查找和更新数组中的元素?
- c++ - UE4 FInternetAddr 端口在我设置后立即设置为 0
- python - LogisticRegression 需要 NxN 矩阵吗?
- flutter - 如何将 UserCredential 转换为用户 - Flutter
- r - R中的对数二项式回归 - 不适合我
- rust - Rustup 不被识别但质朴 - 版本有效
- reactjs - 在 Next.js 中使用 Jest 模拟下一个/链接
- r - R Shiny - 添加指向服务器上不同pdf文件的表值超链接
- c++ - 如何将包含列表的对象写入文件c ++?
- css - CSS中的高级背景渐变