使用 C++ 在 13h 图形模式下显示位图

Displaying a bitmap in 13h graphics mode, with use of C++

我正在尝试显示 320x200x8 位图。我让调色板工作得很好,但是当我尝试显示位时,图像颠倒了。这里应该改什么?

    void display_image_data(char *file_name)
{
 bitmap_file = fopen(file_name, "rb");
 fread(&bmfh, sizeof(bmfh), 1, bitmap_file);
 fread(&bmih, sizeof(bmih), 1, bitmap_file);
 fread(&palette[0], bmih.biClrUsed * sizeof(RGBQUAD),  1, bitmap_file);
 fread(&video_memory[0], bmih.biWidth * bmih.biHeight, 1, bitmap_file);
 fclose(bitmap_file);
}

BMP 文件源自 OS/2,它使用标准绘图轴 — 原点位于显示屏的左下角,正 y 向上移动到屏幕。以 OS/2 顺序存储然后以光栅顺序显示的数据将显示为颠倒。

因此您只需要逐行读取数据并将这些行存储在正确的位置。

看起来您已经假定一个最多 200 行的源文件并将数据直接加载到视频缓冲区(即 A000:0000),因此对您来说等效的方法很简单:

for(int y = bmih.biHeight - 1; --y; y >= 0) {
    fread(&video_memory[y * 320], bmih.biWidth, 1, bitmap_file);
}