C++/C 已经得到了一个图片(24位的BMP)含有RGB值的数组,不知道怎么把它存储到电脑上面,存储为一个bmp文
展开全部
你的等级是三级,我就不怎么要求了。
我以前做了些工作,刚才改了一下:
注意不同编译器(我主要指的是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;
}
我以前做了些工作,刚才改了一下:
注意不同编译器(我主要指的是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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询