2 u011295621 u011295621 于 2016.02.28 18:49 提问

C语言提取BMP图片遇到的问题

有几个问题想请教一下大家。
1:比如100 * 100像素的图片,它对角线应该有200个像素,还是141个像素?
2:100 * 100像素的BMP提取出来的像素点 有30000个还是40000个?我用以下代码提取的是40000个,分别是R,G,B和那个保留吗?还是其他什么?
3:我想实现的是:8位BMP的对角线像素点提取到文本文档,做着做着有点蒙圈了

#include
#include

#pragma pack(2)

/*定义WORD为两个字节的类型*/
typedef unsigned short WORD;
/*定义DWORD为e四个字节的类型*/
typedef unsigned long DWORD;

/*位图文件头*/
typedef struct BMP_FILE_HEADER
{
WORD bType; /* 文件标识符 /
DWORD bSize; /
文件的大小 /
WORD bReserved1; /
保留值,必须设置为0 /
WORD bReserved2; /
保留值,必须设置为0 /
DWORD bOffset; /
文件头的最后到图像数据位开始的偏移量 */
} BMPFILEHEADER;

/*位图信息头*/
typedef struct BMP_INFO
{
DWORD bInfoSize; /* 信息头的大小 /
DWORD bWidth; /
图像的宽度 /
DWORD bHeight; /
图像的高度 /
WORD bPlanes; /
图像的位面数 /
WORD bBitCount; /
每个像素的位数 /
DWORD bCompression; /
压缩类型 /
DWORD bmpImageSize; /
图像的大小,以字节为单位 /
DWORD bXPelsPerMeter; /
水平分辨率 /
DWORD bYPelsPerMeter; /
垂直分辨率 /
DWORD bClrUsed; /
使用的色彩数 /
DWORD bClrImportant; /
重要的颜色数 */
} BMPINF;

/*彩色表*/
typedef struct RGB_QUAD
{
WORD rgbBlue; /* 蓝色强度 /
WORD rgbGreen; /
绿色强度 /
WORD rgbRed; /
红色强度 /
//WORD rgbReversed; /
保留值 */
} RGBQUAD;

int main()
{
FILE *fp;
BMPFILEHEADER fileHeader;
BMPINF infoHeader;
long offset, bmpImageSize, width, height, bytesPerPixel, size, bitCount;
// int i, j;
// unsigned char **p;
WORD c;

if ((fp = fopen("d://a1.bmp", "rb")) == NULL)
{
    printf("Cann't open the file!\n");
    exit(0);
}

fseek(fp, 0, 0);
fread(&fileHeader, sizeof(fileHeader), 1, fp);
fread(&infoHeader, sizeof(infoHeader), 1, fp);

//计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节
size = fileHeader.bSize;
offset = fileHeader.bOffset;
bmpImageSize = infoHeader.bmpImageSize;
width = infoHeader.bWidth;
height = infoHeader.bHeight;
bitCount = infoHeader.bBitCount;
bytesPerPixel = infoHeader.bBitCount / 8;

printf("%d %d %d %d %d %d\n", size, offset, bmpImageSize, width, height, bitCount, bytesPerPixel);

//输出每个像素点所占字节中的内容
c = fgetc(fp);
int sum = 1;

while (!feof(fp))
{

    printf("%d ", c);
    c = fgetc(fp);
    sum++;
}

printf("%d\n",sum-1);

fclose(fp);

return 0;

}

3个回答

u011295621
u011295621   2016.02.28 19:00

我这段代码 用100 * 100像素点的图, 出来40000个数据,都是0~255的, 顺序是BMP图片最左最下的像素点的 argb 然后左2最下的argb是吧? argb中的a是透明度吧?,那么我想计算这个最左下的像素点的灰度值该如何计算?是指用rgb忽略a吗?

caozhy
caozhy 很久以前我也以为是(r+g+b)/3
接近 2 年之前 回复
caozhy
caozhy http://m.zhihu.com/question/22039410
接近 2 年之前 回复
Trent1985
Trent1985   2016.02.28 22:53

按照你的要求,你可以把图像灰度化,然后计算一个通道的数据,就是100*100的大小。至于你说100*100大小的图有多少个像素,告诉你,只有10000个像素,只不过这么多的像素,每个像素的格式不一样,可能是8位的,也能是24位,32位的。

wangyaninglm
wangyaninglm   Ds   Rxr 2016.02.29 10:49

对啊,我也觉的你对角线的像素算的有问题,难道你用的是图形学中的插值算法?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!