C++/C 已经得到了一个图片(24位的BMP)含有RGB值的数组,不知道怎么把它存储到电脑上面,存储为一个bmp文

 我来答
wacs5
2010-09-03 · TA获得超过1.6万个赞
知道大有可为答主
回答量:3724
采纳率:82%
帮助的人:2809万
展开全部
你的等级是三级,我就不怎么要求了。

我以前做了些工作,刚才改了一下:
注意不同编译器(我主要指的是TC可能要修改一下WORD的定义之类的)

#include <mem.h>
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma pack(1)

typedef unsigned char BYTE; /*一个字节的整型*/
typedef unsigned short int WORD; /*两个字节的整型*/
typedef unsigned long DWORD; /*四个字节的整型*/

/*文件头结构*/
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; /*文件类型,BM为BMP*/
DWORD bfSize; /*文件的大小(字节)*/
WORD bfReserved1; /*保留*/
WORD bfReserved2; /*保留*/
DWORD bfOffBits; /*本结构开始处至图形阵列的偏移字节数*/
}BITMAPFILEHEADER;

/*文件信息头结构*/
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; /*本结构的字节数*/
DWORD biWidth; /*以像素数表示图形的宽度*/
DWORD biHeight; /*以像素数表示图形的高度*/
WORD biPlanes; /*色彩平面数,必须为1*/
WORD biBitCount; /*一个像素所占的位数,可以是1、4、8、24*/
DWORD biCompression; /*图形压缩形式,0为不压缩*/
DWORD biSizeImage; /*图形的字节数*/
DWORD biXPelsperMeter; /*1米内的水平像素数*/
DWORD biYPelsPerMeter; /*1米内的垂直像素数*/
DWORD biClrUsed; /*图形中实际用到的像素数*/
DWORD biClrlmportant; /*图形中的重要的颜色数*/
}BITMAPINFOHEADER;

/*颜色*/
typedef struct tagrgb
{
BYTE B;
BYTE G;
BYTE R;
}rgbDATA;

int main(int argc,char *argv[])
{
DWORD Height=240,Width=320;
DWORD BytePerLine,FillZeroNum,PixelN;
DWORD i,j;

BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;

rgbDATA *rgbdata;
BYTE *R,*G,*B;

char *BMtype="BM";
char Zeros[5]="\0\0\0\0";
FILE *fpout;

/*这里生成rgb颜色*/
PixelN=Height*Width;
R=(BYTE *)malloc(sizeof(BYTE)*PixelN);
G=(BYTE *)malloc(sizeof(BYTE)*PixelN);
B=(BYTE *)malloc(sizeof(BYTE)*PixelN);
rgbdata=(rgbDATA *)malloc(sizeof(rgbDATA)*PixelN);
for (i=0;i<PixelN;i++)
{
R[i]=255;
G[i]=0;
B[i]=0;
R[i]=rand()%256;
G[i]=rand()%256;
B[i]=rand()%256;
}

for (i=0;i<PixelN;i++)
{
rgbdata[i].R=R[i];
rgbdata[i].G=G[i];
rgbdata[i].B=B[i];
}

/*写*/
fpout=fopen("d:\\abc.bmp","wb");
if (fpout==NULL)
{
printf("Can not open file!\nPress any key to exit:");
getch();
exit(0);
}

/****生成BMP文件头*/
BytePerLine=(3*Width+3)&0xFFFFFFFC; /*每行多少个字节,包括补零*/
FillZeroNum=(3*Width)&0x03; /*补零的个数*/

fileheader.bfType=*((WORD *)(BMtype));
fileheader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+Height*BytePerLine;
fileheader.bfReserved1=0;
fileheader.bfReserved2=0;
fileheader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
infoheader.biSize=sizeof(BITMAPINFOHEADER);
infoheader.biWidth=Width;
infoheader.biHeight=Height;
infoheader.biPlanes=1;
infoheader.biBitCount=24;
infoheader.biCompression=0;
infoheader.biSizeImage=Height*BytePerLine;
infoheader.biXPelsperMeter=(WORD)(300*39.37007874);
infoheader.biYPelsPerMeter=(WORD)(300*39.37007874);
infoheader.biXPelsperMeter=0;
infoheader.biYPelsPerMeter=0;
infoheader.biClrUsed=0;
infoheader.biClrlmportant=0;
fwrite(&fileheader,sizeof(fileheader),1,fpout);
fwrite(&infoheader,sizeof(infoheader),1,fpout);

for (i=0;i<Height;i++) /*注意:JPG从左上角开始,往右往下;而BMP是从左下角开始,往右往上*/
{
fwrite(&(rgbdata[i*Width]),sizeof(rgbDATA),Width,fpout);
if (FillZeroNum)
fwrite(Zeros,sizeof(BYTE),4-FillZeroNum,fpout);
}
fclose(fpout);
free(R);
free(G);
free(B);
free(rgbdata);
printf("OK");
getch();
return 0;
}
奔跑2024
2010-09-03 · TA获得超过218个赞
知道小有建树答主
回答量:405
采纳率:0%
帮助的人:204万
展开全部
就是以文件流的格式,直接保存为bmp后缀名文件就ok了,只要你数据接收都ok的话。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
silencesword
2010-09-03 · TA获得超过394个赞
知道小有建树答主
回答量:338
采纳率:0%
帮助的人:156万
展开全部
如果连文件头都有了,那么直接保存到一个文件就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式