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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言读取BMP图像数据(转)
BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。 BMP文件格式分析
C语言实现BMP图片生成
/******************************************************** Name: creat_bmp.c* Function: Creat a bmp picture as 320*240* Input parameters: * Output parameters: * Author: ValerianFan* Version : 1.0* Date
LSB算法BMP图片信息隐藏技术 c语言
LSB算法是将信息的每一位隐藏到图片RGB单元的最后一位,由于一位的改变对于颜色影响不大,人的肉眼难以识别,从而达到信息隐藏的效果。 具体需要了解BMP文件格式,前54个字节为图片信息,不能修改,所以从第55个字节开始进行隐藏。具体代码为: #include #include #include int judge(FILE *in,FILE *fil,int &inlen,int &fi
c语言读取BMP图片的RGB数据
BMP图片是位图(bitmap),一般未压缩,要读取BMP文件只要指导它的文件结构就可以了,具体格式可以百度或者google,就不多说了,几个重要的点在代码里面有注释。 /** c语言读取位图信息 **/ #include #include #define BM 19778 // 位图的标志 #define PATH "d:\\test.bmp" //打开的文件路径 //判断是
如何读取一副BMP图像中的数据并存入数组
如何读取一副BMP图像中的数据并存入数组, 我已经用fopen和fread把BMP的头文件和头信息读入相应的结构体了,经过输出是正确的
C语言保存位图文件时的一个问题(.bmp文件)
http://hi.baidu.com/yanghao86/item/310c2359f227cfccd48bacb2 位图文件大概可以分为四个部分:bmp文件头(BITMAPFILEHEADER),位图信息头(BITMAPINFOHEADER),调色板和位图数据。我在用C语言保存一个位图文件的时候,发现保存的文件是错误的,无法正常打开,最后查找发现竟然是因为结构体的内存对齐造成的。
获得和改变bmp图像的亮度对比度
#include #include #include #include bool InitBITMAP(BITMAP* bmp); void InitHist(unsigned char* pImg,int imageSize); int GetBrightNess(unsigned long* LUT,int imageSize); double GetContrast(unsigne
BMP图象(灰度图)转化为二维数组的C语言实现(bmp2array)
以下代码可以实现BMP灰度图到二维数组的转换#include #define get ch=getc(in) #define getdw ch=getc(in);ch=getc(in);ch=getc(in);ch=getc(in) int chabiao(FILE *fp,unsigned char color);int main(int argc, char *argv[]) { FILE *
图片处理(二)之亮度调整
开发语言:C语言, 通用性强 首先通过XnView直接提取图片数据部分,文件类型为:XXX.raw RAW文件中已经除去了结构体头部分,剩下图片数据,这就是图片处理的Source对象。 本代码主要工作是对图片的数据进行光亮度的调整,属于图片处理中最基础的部分。 实现功能包括变亮,模糊变亮,变暗,模糊变暗。 当我们对图片数据进行整体地“+”一个正整数,图片的三色灰度将整体右移,
纯c语言读取BMP图像
#include <stdio.h> #include <fcntl.h> #include <unistd.h>#define RGB(r,g,b) (((r>>3)<<11)|((g>>2)<<5)|(b>>3))typedef unsigned char U8 ; typedef unsigned short U16 ; typedef unsigned int