1

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

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

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

PS我在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 

            }                 
        }

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

4

2 回答 2

0

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

于 2013-01-21T16:48:41.187 回答
0

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

backupImage XOR drawnImage = changes

您还可以使用由AForge.NET包装的 OpenCV及其差异减法类。他们完全按照您的意愿行事。

于 2013-01-18T11:00:21.887 回答