创建24位BMP失败(仅限特定分辨率)

时间:2014-09-19 14:49:53

标签: java android image bmp

我正在创建一个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的原因。

有没有人有线索?我没有取得任何进展。

1 个答案:

答案 0 :(得分:3)

可能是因为BMP文件要求行长度为4个字节的倍数。这会更改您在标题偏移34中指定的大小,因此会更改偏移量2中的大小。有关详细信息,请参阅以下内容:

http://en.wikipedia.org/wiki/BMP_file_format

相关部分:

  

对于文件存储目的,只有每行的大小必须是4个字节的倍数,而文件偏移量可以是任意的

您可以使用MS Paint创建970x970 Red BMP文件来比较文件。