.NET Bitmap.Load方法在不同的计算机上产生不同的结果

Pav*_*.Zh 5 .net c# windows bitmap

我尝试加载JPEG文件并从图像中删除所有黑白像素

C#代码:

    ...
    m_SrcImage = new Bitmap(imagePath);

    Rectangle r = new Rectangle(0, 0, m_SrcImage.Width, m_SrcImage.Height);
    BitmapData bd = m_SrcImage.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

    //Load Colors
    int[] colours = new int[m_SrcImage.Width * m_SrcImage.Height];
    Marshal.Copy(bd.Scan0, colours, 0, colours.Length);
    m_SrcImage.UnlockBits(bd);

    int len = colours.Length;

    List<Color> result = new List<Color>(len);

    for (int i = 0; i < len; ++i)
    {
        uint w = ((uint)colours[i]) & 0x00FFFFFF; //Delete alpha-channel
        if (w != 0x00000000 && w != 0x00FFFFFF)   //Check pixel is not black or white
        {
            w |= 0xFF000000;                      //Return alpha channel
            result.Add(Color.FromArgb((int)w));
        }
    }
    ...
Run Code Online (Sandbox Code Playgroud)

之后,我尝试通过此代码在List中找到唯一的颜色

    result.Sort((a, b) =>
    {
        return  a.R != b.R ? a.R - b.R :
                a.G != b.G ? a.G - b.G :
                a.B != b.B ? a.B - b.B :
                0;
    });


    List<Color> uniqueColors = new List<Color>( result.Count);   

    Color rgbTemp = result[0];

    for (int i = 0; i < len; ++i)
    {
         if (rgbTemp == result[i])
         {       
              continue;
         }

         uniqueColors.Add(rgbTemp);
         rgbTemp = result[i];
    }
    uniqueColors.Add(rgbTemp);
Run Code Online (Sandbox Code Playgroud)

此代码在同一图像上的不同机器上产生不同的结果!

例如,在此图像上它产生:

  • XP SP3上的43198种独特颜色,带有.NET版本4
  • Win7 Ultimate上的43168种独特颜色,带有.NEt版本4.5

您可以在此处下载最低测试项目.它只是打开选定的图像并生成具有独特颜色的txt文件.

还有一个事实.在不同的机器上读取一些像素的方式不同 我将txt文件与notepad ++进行比较,它显示某些像素具有不同的RGB组件.每个组件的差异为1,例如

  • Win7像素:255 200 100
  • WinXP像素:254 199 99

我看过这篇文章

stackoverflow.com/questions/2419598/why-might-different-computers-calculate-different-arithmetic-results-in-vb-net

(对不起,我没有足够的raiting正常链接).

...但是没有信息如何解决它.


在VS 2015 Commumity Edition中使用OS Windows 7的机器上编译了.NET 4 Client profile的项目.