C++/C 已经得到了一个图片(24位的BMP)含有RGB值的数组,不知道怎么把它存储到电脑上面,存储为一个bmp文
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
参考技术A 就是以文件流的格式,直接保存为bmp后缀名文件就ok了,只要你数据接收都ok的话。。。 参考技术B 如果连文件头都有了,那么直接保存到一个文件就可以了
怎样将png图片32位深改为24位深?谢谢
先将文件存成jpg格式,再把jpg格式的文件打开,然后再存成png,保存时PNG选项--交错:无,这样就是24位了,我自己是这样改的。 参考技术A 用ACDSee编辑,修改-转换文件格式-直接转换为png的就可以,记得另存。。。这样转换的就是24位深的png图片 参考技术B 在photoshop里打开文件,32位的是CMYK模式,24位的是RGB模式,你转换一下模式就可以了。然后再保存为png文件即可,望采纳。祝你好运。 参考技术C 在photoshop里打开文件,32位的是CMYK模式,24位的是RGB模式,你转换一下模式就可以了。然后再保存为png文件即可,望采纳。祝你好运。以上是关于C++/C 已经得到了一个图片(24位的BMP)含有RGB值的数组,不知道怎么把它存储到电脑上面,存储为一个bmp文的主要内容,如果未能解决你的问题,请参考以下文章
C语言,提取数组数据,计算得32位的结果。(keil,读SD卡时,遇到的问题)
请教c语言中打印变量的大小被警告是为啥(VS2019/Debug/x64)?