我正在尝试手动绘制从 .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。
这种转换对我来说很奇怪,因为当我用 Notepad++ 查看十六进制数据时,我得到:
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;
关于java - 尝试查找 .bmp 文件的高度和宽度在处理中得到不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68761446/