我正在创建一个24位bmp,一般都可以正常工作(我已经使用过这个功能一段时间了)。现在我试着写一个970 x 970像素的bmp,我最终收到了损坏的文件(之前我输出了更大的图像,我对这个特殊的分辨率有问题)
这是我构建标题的方式:
private static byte[] createHeader(int width, int height) {
int size = width * height * 3 + 54;
byte[] ret = new byte[54];
set(ret, 0, (byte) 'B', (byte) 'M');
set(ret, 2, intToDWord(size));
set(ret, 6, intToDWord(0));
set(ret, 10, intToDWord(54));
set(ret, 14, intToDWord(40));
set(ret, 18, intToDWord(width));
set(ret, 22, intToDWord(height));
set(ret, 26, intToWord(1));
set(ret, 28, intToWord(24));
set(ret, 30, intToDWord(0));
set(ret, 34, intToDWord(width * height * 3));
set(ret, 38, intToDWord(0));
set(ret, 42, intToDWord(0));
set(ret, 46, intToDWord(0));
set(ret, 50, intToDWord(0));
return ret;
}
这是生成的图像(此测试图像应该是完全红色): test_corrupt.bmp (2.6mb)
我已经分析了标题,检查了大小,我找不到此图像不是有效BMP的原因。
有没有人有线索?我没有取得任何进展。
答案 0 :(得分:3)
可能是因为BMP文件要求行长度为4个字节的倍数。这会更改您在标题偏移34中指定的大小,因此会更改偏移量2中的大小。有关详细信息,请参阅以下内容:
http://en.wikipedia.org/wiki/BMP_file_format
相关部分:
对于文件存储目的,只有每行的大小必须是4个字节的倍数,而文件偏移量可以是任意的
您可以使用MS Paint创建970x970 Red BMP文件来比较文件。