在屏幕上呈现时,图像像素值会发生变化

时间:2014-04-07 08:54:13

标签: c# image bitmap comparison

我有一张图片tinytray0.png
tinytray0


当它通过exe文件在屏幕上呈现时,我捕获图像并将其存储为newtray.png
enter image description here

左图相同,尺寸相同。当我尝试通过以下代码逐个像素地比较图像 -

if (img2.Width == img1.Width && img2.Height == img1.Height)
{
     for (int i = 0; i < img2.Width; i++)
     {
           for (int j = 0; j < img2.Height; j++)
           {
               var firstPixel = img2.GetPixel(i, j).ToString();
               var secondPixel = img1.GetPixel(i, j).ToString();
               if (firstPixel != secondPixel)
               {
                   imgeq = false;
                   break;
               }
           }
      }
 }
 else
 {
     imgeq = false;
 }

图像尺寸和分辨率相同,但像素值不同,我将imgeq视为假。

1 个答案:

答案 0 :(得分:0)

在查看你的图像后,我发现它就像我想的那样:原件有圆角,Alpha = 0,捕捉有一个纯白色。所以你可以改变你的代码:

if (img2.Width == img1.Width && img2.Height == img1.Height)
{
     for (int i = 0; i < img2.Width; i++)
     {
           for (int j = 0; j < img2.Height; j++)
           {
               var firstPixel = img2.GetPixel(i, j).ToString();
               var secondPixel = img1.GetPixel(i, j).ToString();

               // skip all non opaque pixels!
               if (img2.GetPixel(i, j).A != 255) continue;  
               if (firstPixel != secondPixel)
               {
                   imgeq = false;
                   break;
               }
           }
      }
 }
 else
 {
     imgeq = false;
 }

这适用于您发布的示例。 但我的其他言论仍然适用:通过正确移动渠道来减少信息并设置可接受的差异水平将使比较更可靠。

但是:此外,您必须考虑并非所有部署计算机都可以使用它们来显示图像而不会出现拉伸或模糊图像!

编辑:我忽略了你的ToString()并更改了代码。 A是ARGB颜色的alpha通道..

注意:你必须决定哪个是png像素;你的编号有点混乱。