【问题标题】:After writing BMP file, image is flipped upside down写入BMP文件后,图像上下翻转
【发布时间】:2014-11-26 12:07:58
【问题描述】:

我正在使用以下代码:

f = fopen( _stringhelper.STR("%s.bmp", filename), "wb" );
if( !f ) {
    _core.Error( ERC_ASSET, "ncImageLoader::CreateImage - Couldn't create %s image.\n", filename );
    return false;
}

int w = width;
int h = height;
int i;

int filesize = 54 + 3 * w * h;

byte bmpfileheader[14] = {
    'B', 'M',
    0, 0, 0, 0,
    0, 0,
    0, 0,
    54, 0, 0, 0 };

byte bmpinfoheader[40] = { 40, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    1, 0,
    24, 0};

byte bmppad[3] = { 0, 0, 0 };

bmpfileheader[2] = (byte)( filesize );
bmpfileheader[3] = (byte)( filesize >> 8 );
bmpfileheader[4] = (byte)( filesize >> 16 );
bmpfileheader[5] = (byte)( filesize >> 24 );

bmpinfoheader[4] = (byte)( w );
bmpinfoheader[5] = (byte)( w >> 8);
bmpinfoheader[6] = (byte)( w >> 16  );
bmpinfoheader[7] = (byte)( w >> 24);
bmpinfoheader[8] = (byte)( h );
bmpinfoheader[9] = (byte)( h >> 8 );
bmpinfoheader[10] = (byte)( h >> 16 );
bmpinfoheader[11] = (byte)( h >> 24 );

fwrite( bmpfileheader, 1, 14, f );
fwrite( bmpinfoheader, 1, 40, f );

for( i = 0; i < h; i++ ) {
    fwrite( data + ( w * (h - i - 1) * 3 ), 3, w, f );
    fwrite( bmppad, 1, ( 4 - ( w * 3 ) % 4 ) % 4, f );
}

fclose(f);

我正在使用glReadPixels() 来捕获显示数据。如果我转到保存此文件的文件夹并打开它 - 很好,调色板很好,但它被颠倒了。我试图“向后”编写 for 循环,但仍然没有。我不明白。

可能是什么问题?

【问题讨论】:

  • 你能展示你的倒退for循环吗? (当前的实际上是“倒退”,但那是因为 BMP 期望它。)

标签: c++ xcode image opengl bmp


【解决方案1】:

BMP 文件格式结构

  • 对于未压缩的 RGB 位图,如果 Height 为 ,则位图为 自底向上的 DIB(设备无关位图),原点位于左下角。

  • 如果高度是,则位图是一个自上而下的DIB,原点 在左上角。

  • 对于 YUV 位图,位图始终是自上而下的,与符号无关 的高度。解码器应该提供带有正数的 YUV 格式 高度,但为了向后兼容,他们应该接受 YUV 具有正或负高度的格式。

  • 对于压缩格式,Height 必须为正数,无论 图像方向。

来源:https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader?redirectedfrom=MSDN

【讨论】:

    【解决方案2】:

    位图“倒置”存储,在此处查看更多信息:

    Why are bmps stored upside down?

    您可以将高度设置为负值以使其正确显示。 (-身高)

    来自MSDN site, BITMAPINFOHEADER

    如果 biHeight 为负数,则位图是一个自上而下的 DIB,其 原点在左上角。

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 2011-06-09
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多