使单个像素无效?

时间:2011-05-13 21:39:59

标签: c# zoom pixel picturebox invalidation

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

问题是图像在SizeMode设置为Zoom的图片框中呈现,每次更新像素时无效,实际上速度较慢,而较大的图片框会变慢(对于相同尺寸的图像)

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;
        }
    }

然后使像这样的无效像素无效:

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

当我第一次这样做时,我只是使像素直接覆盖的无效,但发现这可能会出现舍入错误,因此将其扩展为包括一些额外的错误。

答案 2 :(得分:0)

我只需添加一个每秒触发30或60次的计时器,使整个控件无效。虽然更新可能会略有延迟,但由于显示器的刷新率最高可能只有60 Hz,因此无法注意到它。