C# 在屏幕上渲染时,图像像素值会发生更改

C# 在屏幕上渲染时,图像像素值会发生更改,c#,image,bitmap,comparison,C#,Image,Bitmap,Comparison,我有一张tinytray0.png图像 当它通过exe文件呈现在屏幕上时,我捕获图像并将其存储为newtray.png 这是相同的图像和尺寸是相同的。当我尝试通过以下代码逐像素比较图像时- if (img2.Width == img1.Width && img2.Height == img1.Height) { for (int i = 0; i < img2.Width; i++) { for (int j = 0; j <

我有一张tinytray0.png图像

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

这是相同的图像和尺寸是相同的。当我尝试通过以下代码逐像素比较图像时-

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为false。

查看您的图像后,我发现它与我所想的一样:原始图像具有圆角,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像素;您的编号有点混淆。

这两张图像来自不同的来源,为什么您希望它们逐像素相等,一般来说,永远不要逐像素比较两张图像。这比一点一点比较两个浮点数还要糟糕。那么,我如何比较这两个图像,以使结果为真?是否使用与原始图像相同的颜色深度保存新的png?如何使用相同的颜色深度保存它?我使用以下代码保存它-位图托盘=新位图NPDVariableMap.NPDUITrayImage.CaptureImage;盘Save@E:\IGHS Automation\MAIN\Tesco.Instore.Automation.UITest\NPDImages\newtray.png;即使有同样的深度,你也不会得到同样的结果?我尝试按您所说的方式实现,但发现一个错误“string”不包含“a”的定义,并且找不到接受“string”类型的第一个参数的扩展方法“a”。是否缺少using指令或程序集引用?