尝试查找 .bmp 文件的高度和宽度在处理过程中得到不一致的结果

Trying to find the height and width of a .bmp file gets inconsistent results in processing

我正在尝试手动绘制我读取的 .bmp 文件的像素。

此信息存储在 BMP Header 中。图像宽度(4 字节 - 0x12 到 0x15)、图像高度(4 字节 - 0x16 - 0x19)和原始像素数据的偏移量(4 字节 - 0xa 到 0xd)。 为了找到宽度和高度,我使用这个:

byte[] bytes = loadBytes("ImageFile.bmp");
imageWidth =  ((bytes[0x12]) | (bytes[0x13])<<8 | (bytes[0x14])<<16 | (bytes[0x15])<<24) ;
imageHeight = ((bytes[0x16]) | (bytes[0x17])<<8 | (bytes[0x18])<<16 | (bytes[0x19])<<24) ;
offset = (bytes[0xa]) | (bytes[0xb])<<8 | (bytes[0xc])<<16 | (bytes[0xd])<<24;
size(imageWidth,imageHeight);  

之后,我得到了准确的结果:imageWidth 是 600,imageHeight 是 780。

但是对于较小的 bmp 图像,250x250,经过相同的计算,我得到了 2 的补码的答案:imageWidth 是 -6,imageHeight 是 -6。

这个转换对我来说很奇怪,因为当我用记事本++查看十六进制数据时,我得到:

fa 00 00 00 fa 00 00 00  

这些来自 0x12 - 0x19 的字节。 它们不存储为有符号值。那我为什么要这样读呢?

有没有一种方法可以不考虑实际大小来获取实际无符号值?

谢谢!

请参阅我上面关于以艰难的方式做到这一点的评论。这要容易得多:

ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
bb.position(0x12);
int width = bb.getInt();
int height = bb.getInt();

困难的方式:

long imageWidth = bytes[0x12] & 0xFF | (bytes[0x13] & 0xFF) << 8 | (bytes[0x14] << 16) & 0xFF | (bytes[0x15] << 24) & 0xFF;
long imageHeight = bytes[0x16] & 0xFF | (bytes[0x17] & 0xFF) << 8 | (bytes[0x18] & 0xFF) << 16 | (bytes[0x19] & 0xFF) << 24;