C# 位图图像以不同方式读取32/64位构建

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

编辑:第一部分似乎不是问题,请参见下文(感谢Ted和Jim):

这是p-hash实现的一部分。代码运行良好且一致,但在64和32下编译时,某些图像的结果略有不同。(平均值为uint)

然后在一个嵌套的for循环中

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