【问题标题】:How to save .bmp image data to array and get RGB values of each pixel?如何将 .bmp 图像数据保存到数组并获取每个像素的 RGB 值?
【发布时间】:2014-12-28 21:02:27
【问题描述】:

我正在创建一个程序,它可以读取 bmp 图像并计算其上红色、蓝色和绿色的百分比。查了很多,但不明白图像数据究竟是从哪个字节开始的,如何获取像素的RGB值?

#include<stdio.h>

typedef struct {
unsigned int fileSize;
unsigned int offset;
unsigned int reserved;
char signature[2];
} BmpHeader;

typedef struct {
unsigned short bitDepth;
unsigned int compressedImageSize;
unsigned int compression;
unsigned int headerSize;
unsigned int height;
unsigned int horizontalResolution;
unsigned int importantColors;
unsigned int numColors;
unsigned short planeCount;
unsigned int verticalResolution;
unsigned int width;
} BmpImageInfo;

typedef struct {
unsigned char blue;
unsigned char green;
unsigned char red;
} Rgb;

int main(void) {
 BmpHeader header;
 BmpImageInfo info;



 char filename[40];
 printf("Enter file name : ");scanf("%s", filename);
 FILE *fp;
 fp = fopen(filename, "rb");
 fread(&header, 1, sizeof(BmpHeader), fp);
 fread(&info, 1, sizeof(BmpImageInfo), fp);

 printf("%u", info.height);





 getchar();
 return 0;

}

为什么我的高度不对???

【问题讨论】:

  • 考虑使用 OpenCV
  • 能否提供其C接口的链接
  • 它的 C 接口被弃用,取而代之的是它的 C++ 接口。它的 C++ 接口需要对 C++ 的最少了解(我今年秋天通过 OpenCV 学习了 C++)。基本上,您只需使用 imread 读取图像以从文件创建 Mat 对象,然后使用 at 方法访问 rgb 值。 StackOverflow 上有多个关于此的帖子。
  • 有些人会认为这是这样做的一个重大缺点。说“我可以让它工作,但不明白它是如何做到的......”并不是一种荣誉徽章。

标签: c


【解决方案1】:

此链接指向描述 .bmp 图像格式的 wiki 页面。注意事项:

  1. .bmp 图像对所有字段使用小端序
  2. 字段之间没有间隙/填充物,因此需要 被视为 char 数组和/或使用 #pragma pack 对于描述图像的结构。 更喜欢char数组方法。
  3. 有一个字段描述每个像素中的位数。 复制数据时您将需要该信息。 另请注意,每像素 24 位的图像可以有第 4 个字段 不透明度,所以每个像素实际上是 32 位。

Here is the link.

【讨论】:

  • 使用库实际上更好,因为实现一个完整的位图处理接口应该是一项复杂的任务。但是,仍然无法给出更好的答案。希望你能理解我蹩脚的英语,我正在学习......
  • 4.每行 pixelsbytes 数被填充为 4 的倍数。例如,3 字节 RGB 大小的 5 个像素后跟 1 个填充字节。
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2011-08-10
相关资源
最近更新 更多