gpt4 book ai didi

c - 从位图中读取颜色字节 (RGB)

转载 作者:行者123 更新时间:2023-11-30 20:20:26 27 4
gpt4 key购买 nike

我编写的代码存在问题,该代码应以 bmp(位图)格式显示图像每个像素的 RGB 颜色值的字节。

我知道在 Windows api 中如何以更实用的方式使用位图,但由于我希望最终的代码在操作系统方面是可移植的,所以我创建了结构体,并且我只是阅读 C 的基础知识.

代码如下:

#include <stdio.h>
#include <stdlib.h>

unsigned char *readBMP(char *filename, int *size) {
int width, height;
unsigned char *data;
unsigned char info[54];

FILE *file = fopen(filename, "rb");
if (file == NULL)
return 0;

fread(info, sizeof(unsigned char), 54, file); // read the 54-byte header

// extract image height and width from header
width = *(int *) &info[18];
height = *(int *) &info[22];

*size = 3 * width * height;
data = (unsigned char *) malloc(*size * sizeof(unsigned char)); // allocate 3 bytes per pixel
fread(data, sizeof(unsigned char), (size_t) *size, file); // read the rest of the data at once

for (int i = 0; i < *size; i += 3) {
unsigned char tmp = data[i];
data[i] = data[i + 2];
data[i + 2] = tmp;
}

fclose(file);
return data;
}

int main() {
int size = 0;
char filename[] = "output.bmp";
unsigned char *data = readBMP(filename, &size);

for (int i = 0; i < size; i++) {
printf("%d. %d\n", i + 1, (int) data[i]);
if ((i + 1) % 3 == 0)
printf("\n");
}

free(data);
return 0;
}

像素的RGB编码:

(0, 0, 0), (0, 0, 255),
(0, 255, 0), (0, 255, 255),
(255, 0, 0), (255, 0, 255);

我试图“读取”的图像是一个 2x3 像素位图:https://prnt.sc/gnygch

我的输出是:

1. 255
2. 0
3. 0

4. 255
5. 0
6. 255

7. 0
8. 0
9. 0

10. 255
11. 0
12. 255

13. 0
14. 0
15. 255

16. 0
17. 0
18. 0

第一个读数甚至与位图底部的像素匹配,但其他读数与其他像素不匹配,至少按照它们的排列顺序不匹配。

有人能看出我做错了什么吗?

最佳答案

位图的大小不是宽度 * 高度 * 3。应该使用

来计算
size = ((width * bitcount + 31) / 32) * 4 * height;

在本例中,bitcount 为 24。

24 位位图中的行必须进行填充。您还需要确保您正在读取 24 位位图。您需要针对 32 位位图使用不同的算法,并针对托盘位图使用不同的算法。

行是从下到上读取的。

下面是 24 位的示例。

您可能仍会遇到此代码的其他问题。最好使用库来实现这些功能。如果您不想使用 Windows 功能,则可以使用可在不同操作系统上使用的第 3 方库。有很多这样的库。

int main()
{
int width, height, padding, bitcount, size;
unsigned char *data = 0;
unsigned char info[54] = { 0 };
FILE *file = fopen("output.bmp", "rb");
if(!file)
return 0;

fread(info, 1, 54, file);
width = *(int*)(info + 18);
height = *(int*)(info + 22);
bitcount = *(int*)(info + 28);
size = ((width * bitcount + 31) / 32) * 4 * height;
padding = width % 4;
if(bitcount != 24) //this code works for 24-bit bitmap only
goto error;

data = malloc(size);
fread(data, 1, size, file);
for(int row = height - 1; row >= 0; row--)
{
for(int col = 0; col < width; col++)
{
int p = (row * width + col) * 3 + row * padding;
printf("%02X%02X%02X ", data[p + 0], data[p + 1], data[p + 2]);
}
printf("\n");
}

error:
if(file) fclose(file);
if(data) free(data);
return 0;
}

关于c - 从位图中读取颜色字节 (RGB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46354887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com