我正在处理一些图像处理和调试,我在原始位图上覆盖颜色。
问题是图像在 SizeMode 设置为 Zoom 的图片框中呈现,并且每次更新像素时都会失效 真的很慢,而且更大的图片框变得更慢(对于相同尺寸的图像)
我认为可能有帮助的是,如果我只使我更改的像素无效,但我不知道如何将我更改的像素的坐标转换为控件上呈现的矩形。显然,如果图像被绘制得比原始图像大,那么我要无效的矩形将超过一个像素
我正在处理一些图像处理和调试,我在原始位图上覆盖颜色。
问题是图像在 SizeMode 设置为 Zoom 的图片框中呈现,并且每次更新像素时都会失效 真的很慢,而且更大的图片框变得更慢(对于相同尺寸的图像)
我认为可能有帮助的是,如果我只使我更改的像素无效,但我不知道如何将我更改的像素的坐标转换为控件上呈现的矩形。显然,如果图像被绘制得比原始图像大,那么我要无效的矩形将超过一个像素
您可以更改所有像素,然后使图像无效一次吗?
添加了获取图片痘的缩放和填充的方法
private void CalculateZoomAndPadding()
{
Double imageAspect = (Double)pictureBox1.Image.Width / (Double)pictureBox1.Image.Height;
Double pbAspect = (Double)pictureBox1.Width / (Double)pictureBox1.Height;
Boolean heightRestricted = imageAspect < pbAspect;
hPadding = 0;
vPadding = 0;
if (heightRestricted)
{
zoom = (Double)pictureBox1.Height / (Double)pictureBox1.Image.Height;
Double imageWidth = (Double)pictureBox1.Image.Width * zoom;
hPadding = (Double)(pictureBox1.Width - imageWidth) / 2d;
}
else
{
zoom = (Double)pictureBox1.Width / (Double)pictureBox1.Image.Width;
Double imageHeight = (Double)pictureBox1.Image.Height * zoom;
vPadding = (Double)(pictureBox1.Height - imageHeight) / 2d;
}
}
然后像这样使一个称为 invalidate 的像素无效:
pictureBox1.Invalidate(new Rectangle(Convert.ToInt32(Math.Floor(x * zoom)) + Convert.ToInt32(hPadding) -1, Convert.ToInt32(Math.Floor(y * zoom)) + Convert.ToInt32(vPadding) -1, PixelSize, PixelSize));
当我第一次这样做时,我只使像素直接覆盖的区域无效,但发现这会受到舍入误差的影响,因此将其扩展为包括一些额外的。
我只需添加一个每秒触发 30 或 60 次的计时器,它会使整个控件无效。虽然更新可能会稍有延迟,但您不应该注意到它,因为您的显示器的刷新率很可能只是 60 Hz。