gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:40:17 26 4
gpt4 key购买 nike

我尝试加载 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));
}
}
...

之后我尝试通过这段代码在列表中找到独特的颜色

    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);

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

例如,在 this image 上它产生:

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

您可以进行的最低测试项目 download here .它只是打开选定的图像并生成具有独特颜色的 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

(抱歉,我没有足够的 rait 用于正常链接)。

...但是没有关于如何修复它的信息。


项目是在 VS 2015 Community Edition 中为操作系统 Windows 7 的机器上的 .NET 4 客户端配置文件编译的。

最佳答案

Wikipedia has this to say about the accuracy requirements for JPEG Decoders :

The encoding description in the JPEG standard does not fix the precision needed for the output compressed image. However, the JPEG standard (and the similar MPEG standards) includes some precision requirements for the decoding, including all parts of the decoding process (variable length decoding, inverse DCT, dequantization, renormalization of outputs); the output from the reference algorithm must not exceed:

  • a maximum of one bit of difference for each pixel component
  • low mean square error over each 8×8-pixel block
  • very low mean error over each 8×8-pixel block
  • very low mean square error over the whole image
  • extremely low mean error over the whole image

(我的重点)

简而言之,这里有两种不同的解码器实现,它们在精度要求范围内产生不同的图像(正如您观察到的那样,组件值中的 1 位 = +/- 1)。

没有使用相同的(非内置的)jpeg 解码器,这是可以预料的。如果您需要完全相同的输出,那么您可能需要切换到不同的解码器,无论您在哪个 .NET 版本或 Windows 上运行它,该解码器都是相同的。我猜 GDI+ 是罪魁祸首,因为它自 Windows XP 以来经历了更大的变化。

关于c# - .NET Bitmap.Load 方法在不同的计算机上产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com