c - 从缓冲区渲染位图图像

标签 c bitmap bmp

我有一个脚本,它使用 fread 将 bmp 数据复制到缓冲区类型 byte** BUFF; 我在动态分配后使用以下格式的缓冲区:BUFF[nImages][Data];。 然而,这部分效果很好......

问题是当我尝试渲染内容时。图像发生弯曲,如左侧所示。右边的图像是原始图像。 Right one is the original

我用来渲染图像的代码是:

word ofs = 54;

byte sgetc (byte *str)
{
    return str[ofs++];
}

void bmp_drawfbuff ()
{
    word WIDTH, HEIGHT, W, H;
    byte R, G, B;

    HEIGHT = BMPDATA[0][18] + BMPDATA[0][19] * 256;
    WIDTH = BMPDATA[0][22] + BMPDATA[0][23] * 256;

    for(W=0; W<WIDTH; W++)
    {
        for(H=0; H<HEIGHT; H++)
        {
            B = sgetc(BMPDATA[0]);
            G = sgetc(BMPDATA[0]);
            R = sgetc(BMPDATA[0]);


            setpen(R, G, B, 0, 1);
            putpixel(W, H);
        }
    }
}

请注意,直接从文件渲染时,使用 fseekfgetc 的相同代码可以工作。我做错了什么?

更新:

enter image description here

最佳答案

图像尺寸似乎有问题。 宽度小于应有的宽度。 尝试在此处交换 WIDTH 和 WIDTH:

HEIGHT = BMPDATA[0][18] + BMPDATA[0][19] * 256;
WIDTH = BMPDATA[0][22] + BMPDATA[0][23] * 256;

然后,我认为您需要在 for 中交换计数器变量:

for(W=0; H<WIDTH; W++)
{
    for(H=0; W<HEIGHT; H++)
    {

说明:

Let's assume that you have 10x9 image:

  1 2 3 4 5 6 7 8 9 10
1 --------------------
2 --[]----------------
3 --[]------------[]--
4 --[]------------[]--
5 --[][][][][][][][]--
6 ------[]------------
7 ------[]------------
8 ------[]------------
9 ------[]------------

在 .bmp 中,它存储为一维数组:

----------------------[]------------------[]------------[]----[]------------[]----[][][][][][][][]--------[]------------------[]------------------[]------------------[]------------

如果您将其视为 9x10 图像(而不是 10x9),您会看到以下内容:

------------------
----[]------------
------[]----------
--[]----[]--------
----[]----[][][][]
[][][][]--------[]
------------------
[]----------------
--[]--------------
----[]------------

垂直线|变成对角线\
你的照片也有同样的效果。

关于c - 从缓冲区渲染位图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24091096/

相关文章:

c++ - GDI+图像缩放问题

java - 我如何合并红绿色和蓝色位图以获得原始位图

visual-studio-2012 - Visual Studio 2012 - vshost32-clr2.exe 已停止工作

C fread() 一个结构体

c - C 中是否有替代 strtoull() 函数的方法?

c - "int *"类型的参数与 "int (*)[1000]"类型的参数不兼容

java - Android位图到缓冲图像

c# - 使用 C# 从二维数组绘制 .bmp

c - 读取 bmp header C++ 时出错(颜色数 = 0)

C:如何查找用户输入的一年中某一天的日期名称