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

标签 java bit-manipulation processing bmp

我正在尝试手动绘制从 .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/

相关文章:

java - 通过Thread.sleep()模拟文件传输

java - Spring Security访问被拒绝角色或还有什么?

c++ - |、~ 和 & 运算符的运算符优先级?

java - 处理——运动图像留下痕迹

java - 处理中出现大括号问题

java - Java 中的这个 'String.format(".. .");' 是做什么的?

java - 程序图渲染优化: Draw only visible part?

c - 从 int 读取字节以写入 Unicode C

python-3.x - 二进制数字: '-0b1'代表什么?

sockets - Adobe AIR 桌面应用程序与处理应用程序通信