0

我正在处理一些图像处理和调试,我在原始位图上覆盖颜色。

问题是图像在 SizeMode 设置为 Zoom 的图片框中呈现,并且每次更新像素时都会失效 真的很慢,而且更大的图片框变得更慢(对于相同尺寸的图像)

我认为可能有帮助的是,如果我只使我更改的像素无效,但我不知道如何将我更改的像素的坐标转换为控件上呈现的矩形。显然,如果图像被绘制得比原始图像大,那么我要无效的矩形将超过一个像素

4

3 回答 3

1

您可以更改所有像素,然后使图像无效一次吗?

于 2011-05-13T21:53:50.360 回答
1

添加了获取图片痘的缩放和填充的方法

    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));

当我第一次这样做时,我只使像素直接覆盖的区域无效,但发现这会受到舍入误差的影响,因此将其扩展为包括一些额外的。

于 2011-06-13T12:11:18.400 回答
0

我只需添加一个每秒触发 30 或 60 次的计时器,它会使整个控件无效。虽然更新可能会稍有延迟,但您不应该注意到它,因为您的显示器的刷新率很可能只是 60 Hz。

于 2011-05-13T21:57:20.113 回答