如何在 HEX 中为 BMP 图像的分辨率设置负值

Posted

技术标签:

【中文标题】如何在 HEX 中为 BMP 图像的分辨率设置负值【英文标题】:How to set an negative value to the resolution of a BMP image in HEX 【发布时间】:2016-05-21 21:39:39 【问题描述】:

有人问过有关 BMP 文件的这些问题,但没有人真正解释如何将负高度值直接放入 BMP 图像的十六进制编辑器中。我的图像是 640x480,问题是(众所周知)BMP 图像是从左下侧通过每一行到顶部扫描的。这使我的图像镜像等待,因为它们被自上而下地扫描(源代码就是这样做的)。高度的正值是十六进制的 80 02 (640)。负 640 在十六进制中的负值是多少?

【问题讨论】:

了解two's complement Check the file here 这是使用 -480 宽度的 BMP 标头: 42 4D 36 B4 04 00 00 00 00 00 36 00 00 00 28 00 00 00 80 02 00 00 1F FE 00 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00,但它不起作用。将 E0 01 (480) 更改为 1F FE (-480) 不可行。 案子没有解决…… 您确定这些数字不是 16 位的吗?还是它们是 32 位的? 【参考方案1】:

您需要的是仅反转 高度(不是宽度,阅读 cmets 似乎有些混乱)。这应该使 BMP 解码器从顶部/向下读取图像,而不是正常的底部/向上读取图像。

请注意,BMP 16 位和 32 位值始终使用 little endian (Intel) 字节顺序存储

您使用的 40 字节 BMP 标头(如 0x28 00 00 00 在偏移量 14 处所见,也称为 "Windows Bitmap Info Header")使用 32 位值作为宽度/高度。

因此,作为 LE 字节顺序的 32 位值,-480 被写为0x20 FE FF FF(在偏移量 22 处)。


作为概念证明,这里是来自BMP Suite 的g/rgb24.bmp,在转换前后(高度分别为64/0x40 00 00 00-64/0xC0 FF FF FF,偏移量为22):

这些都可以在 OS X 上使用 Preview 正常打开(显然是 SO/imgur,因为它们可以方便地将文件转换为 PNG)。

这是download link for the flipped file, as BMP。

【讨论】:

嗨。我没有改变宽度。只有高度。我已经尝试了 20 FE FF FF,但在我的计算机上无法使用 GIMP 或 GRAFX2 打开...我需要它来更改图像... 查看我的编辑。你能打开这些文件吗?请注意,您需要使用精确值 C0 FF FF FF覆盖从偏移 22 到 25 的 4 个字节。 它有效...我一定犯了一些错误...谢谢。 ?? 现在我也可以用同样的方式处理其余的文件(除了那些缺少填充的文件)。谢谢?? 现在我得到了 BMP 格式的所有数据文件,从上到下分别为 640x480、320x240 和 97x55 像素。缺少 190x107(填充问题)。 97x55 没有添加填充就可以工作...但是 190x107 没有它就无法工作...奇怪...

以上是关于如何在 HEX 中为 BMP 图像的分辨率设置负值的主要内容,如果未能解决你的问题,请参考以下文章

怎么提高png图象的质量?

浅看文件格式

在 Matlab 中保存为图形格式文件的图像的大小和分辨率

如何在 JSF 中为标准验证器设置自定义消息?

如何在 netbeans 中为 JPanel 设置背景图像? [复制]

每当在 recyclerview 中为 base64 图像调用 notifydatasetchanged() 时,图像就会闪烁