【问题标题】:Invalidate a single Pixel?使单个像素无效?
【发布时间】:2011-05-13 21:39:59
【问题描述】:

我正在处理一些图像,为了调试,我正在原始位图上叠加颜色。

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

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

【问题讨论】:

    标签: c# zooming pixel picturebox invalidation


    【解决方案1】:

    你能改变所有的像素然后让图像失效一次吗?

    【讨论】:

    • 那样我看不到图像处理在每个像素上的工作情况,我只会得到成品而不是到达那里所采取的步骤。
    • 你不会看到它在每个像素上都起作用,除非你要么限制它,要么你的处理速度相当慢。不要忘记您的显示器无法每秒更新 1000 次。
    • 当我查看我想要调查的区域时,我会限制它,但是当我查看大图像时,可能需要 10 分钟才能到达我感兴趣的位置.
    【解决方案2】:

    增加了获取图片痘痘缩放和内边距的方法

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

    当我第一次这样做时,我只是使像素直接覆盖的区域无效,但发现这会产生舍入错误,因此将其扩展为包含一些额外的内容。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 假设它可以每秒失效 30 次。
      猜你喜欢
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多