C# 位图图像以不同方式读取32/64位构建
编辑:第一部分似乎不是问题,请参见下文(感谢Ted和Jim): 这是p-hash实现的一部分。代码运行良好且一致,但在64和32下编译时,某些图像的结果略有不同。(平均值为uint) 然后在一个嵌套的for循环中C# 位图图像以不同方式读取32/64位构建,c#,build,bitmap,bit-manipulation,bitmapimage,C#,Build,Bitmap,Bit Manipulation,Bitmapimage,编辑:第一部分似乎不是问题,请参见下文(感谢Ted和Jim): 这是p-hash实现的一部分。代码运行良好且一致,但在64和32下编译时,某些图像的结果略有不同。(平均值为uint) 然后在一个嵌套的for循环中 uint pixel = (uint)squeezed.GetPixel(x, y).ToArgb(); 但这些价值观不同: 4287269514 4290559164 4290559164 4289835184 4285687133 4285421390 4288056455 42
uint pixel = (uint)squeezed.GetPixel(x, y).ToArgb();
但这些价值观不同:
4287269514
4290559164
4290559164
4289835184
4285687133
4285421390
4288056455
4290427578
4290559164
4294769916
vs:
4287335307
4290559164
4290559164
4289900719
4285752925
4285487183
4288121992
4290493371
4290559164
4294901502
..当在32位和64位版本中执行此代码时,您是否绝对确定
灰度数组具有相同的值?与您的问题(?)无关,但为什么要(int)(63L-i)
而不是(63-i)
?这很奇怪。64位中的值为47C7 E3C0 C100 0000
。在32位中,它是47C7 E3C0 c800000
。不同之处在于32位版本比64位版本左移了一位。差异可能在图像字节中吗?您是否获得原始图像位而不考虑填充?是否为浮点类型的grayscale[i]
和averageValue
,以及浮点计算的结果?你能不能检查一下64个比较,实际上Jim的评论显示循环中哪个i
不同意…Ted:结果是不,灰度数组不一样,有一些细微的差别。结合Jim,这是正确的,因为这些不同的值(但不是填充问题),所以缺少移位。我将更新这个问题-灰度数组应该根据构建而改变,这仍然很奇怪。
// Squeeze the image into an 8x8 canvas
Bitmap squeezed = new Bitmap(8, 8, PixelFormat.Format32bppRgb);
Graphics canvas = Graphics.FromImage(squeezed);
canvas.CompositingQuality = CompositingQuality.HighQuality;
canvas.InterpolationMode = InterpolationMode.HighQualityBilinear;
canvas.SmoothingMode = SmoothingMode.HighQuality;
canvas.DrawImage(image, 0, 0, 8, 8);
uint pixel = (uint)squeezed.GetPixel(x, y).ToArgb();