读取使用Graphics对象设置的像素

时间:2013-01-18 10:39:50

标签: c#

我知道几种读取Bitmap像素或从图像中获取Graphic对象的方法,但我想要了解的是如何知道用户通过Graphics对象绘制了哪些像素。示例:用户使用以下内容绘制一条线(但可能是任何可能的形状):

surface.DrawLine(aPen, X0, Y0, X1, Y1);      

我需要知道用户设置了哪些像素来执行某些处理。对于使用数学的简单形状(即X = X0 +(X1-X0)* t),这可以很容易地完成,但在我看来可能效率不高(特别是对于复杂的形状)。我想要的解决方案是读取一个Bitmap来查找已设置的像素,但我不知道从Graphics对象获取Bitmap图像(或任何相关的数据结构)的方法。因为这显然需要允许用户绘制的任何程序,我肯定会遗漏一些观点。有人暗示过这个吗?

P.S。我在Windows窗体中的8Bpp索引位图上使用Graphics对象,我需要所有的像素坐标,可能还有像素值(我猜测它们可以从像素坐标推导出来)

提议的解决方案

我可以在这篇文章中的贡献后得出的最佳解决方案与此类似(作为sourceImage我想要绘制的图像并在其上呈现sourceImage的图片框控件):

         private void DrawOverlay()
        {
            using (var tmpImg = new Bitmap (SourceImage.Width,SourceImage.Height, PixelFormat .Format32bppArgb))
            {
                var g = Graphics.FromImage(tmpImg);
                g.DrawLine(pen1, Startx, Starty, Endx, Endy);
                tmpImg.MakeTransparent(Color.FromArgb(0, 0, 0));
                surface.DrawImage(tmpImg, new Point (0, 0));      

// process here the tmpImg  pixels drawn by the user 

            }                 
        }

如果有人有更好的答案,如果您愿意,请告诉我们;否则我会关闭帖子回答我自己的问题,如上所述。

2 个答案:

答案 0 :(得分:0)

我建议在创建Graphics上下文之前制作图像的副本。使用Graphics上下文处理完所有绘画后,您可以使用XOR将图像与第一个(备份)进行比较(请参阅this example)。结果仅包含已更改的像素。

backupImage XOR drawnImage = changes

您还可以使用AForge.NET包裹的OpenCV及其DifferenceSubstract类。他们完全按照你的意愿行事。

答案 1 :(得分:0)

据我所知,收到反馈后问题中提出的解决方案草案似乎是一个可以轻松访问所绘像素的可接受解决方案。