java bmp rgb数组_将RGB数据写入BMP位图文件
CFile file; //定義一個文件對象
_ASSERTE(file.Open(CString("E:\\94.bmp"), CFile::modeRead));//打開文件
DWORD dwLen = file.GetLength(); //獲取文件長度
file.Seek(54, CFile::begin); //略過位圖文件頭、信息頭 ,為什么是54,往下看
buffer = new BYTE[dwLen - 54]; //為緩沖區分配空間
file.Read(buffer, dwLen - 54);
//(整個位圖由文件頭、信息頭、調色板、顏色表這四部分組合構成
typedef long LONG;
typedef unsigned long DWORD;
typedef unsigned short WORD;
#pragma pack (push ,1)//由于4字節對齊,而信息頭大小為54字節,第一部分14字節,
//第二部分40字節,所以會將第一部分補齊為16自己,直接用sizeof,打開圖片時就會
//遇到premature end-of-file encountered錯誤
typedef struct {//位圖文件頭,14字節
WORD bfType; // 指定文件類型,必須是0x424D,即字符串“BM”,也就是說所有.bmp文件的頭兩個字節都是“BM”。
DWORD bfSize; // 位圖文件的大小,包括這14個字節,以字節為單位
WORD bfReserved1; // 位圖文件保留字,必須為0
WORD bfReserved2; // 位圖文件保留字,必須為0
DWORD bfOffBits; // 位圖數據的起始位置,以相對于位圖, 文件頭的偏移量表示,以字節為單位
} BMPFILEHEADER_T;
#pragma pack (pop)
typedef struct{//這個結構的長度是固定的,為40個字節,可以自己算一下,DWORD、LONG4個字節,WORD兩個字節
DWORD biSize;//指定這個結構的長度,為40
LONG biWidth;//指定圖象的寬度,單位是象素。
LONG biHeight;//指定圖象的高度,單位是象素。
WORD biPlanes;//必須是1,不用考慮。
WORD biBitCount;/*指定表示顏色時要用到的位數,常用的值為1(黑白二色圖), 4(16色圖),
8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,這里就不做討論了)。*/
DWORD biCompression;/*指定位圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,
BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,
Windows位圖可以采用RLE4,和RLE8的壓縮格式,但用的不多。
我們今后所討論的只有第一種不壓縮的情況,即biCompression為BI_RGB的情況。*/
DWORD biSizeImage;/*指定實際的位圖數據占用的字節數,其實也可以從以下的公式中計算出來:
biSizeImage=biWidth’ × biHeight
要注意的是:上述公式中的biWidth’必須是4的整倍數(所以不是biWidth,而是biWidth’,
表示大于或等于biWidth的,最接近4的整倍數。舉個例子,如果biWidth=240,則biWidth’=240;
如果biWidth=241,biWidth’=244)。如果biCompression為BI_RGB,則該項可能為零*/
LONG biXPelsPerMeter;//指定目標設備的水平分辨率,單位是每米的象素個數
LONG biYPelsPerMeter;//指定目標設備的垂直分辨率,單位同上。
DWORD biClrUsed;//指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2的biBitCount指數次冪
DWORD biClrImportant;//指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。
} BMPINFOHEADER_T;
char * bmp_file = "fuck you.bmp";//要保存的bmp文件名,后綴不要忘了
//int width = cx.GetWidth();圖像寬高,已知
//int height = cx.GetHeight();
int datalen = width*height * 3 * sizeof(char); // 每個像素點3個字節
//_ASSERTE(l == size);
// 位圖第一部分,文件信息
BMPFILEHEADER_T bfh;
int dw = sizeof(DWORD);
int ww = sizeof(WORD);
int kk = sizeof(BMPFILEHEADER_T);//14,不對齊的話會得到16,這樣創建的BMP打不開
int nn = sizeof(BMPINFOHEADER_T);// second section size
bfh.bfType = (WORD)0x4d42; //bm
bfh.bfSize = datalen + kk+ nn;
bfh.bfReserved1 = 0; // reserved
bfh.bfReserved2 = 0; // reserved
bfh.bfOffBits = sizeof(BMPFILEHEADER_T) + sizeof(BMPINFOHEADER_T);//真正的數據的位置
// 位圖第二部分,數據信息
BMPINFOHEADER_T bih;
bih.biSize = sizeof(BMPINFOHEADER_T);
bih.biWidth = width;
bih.biHeight = height;//有時你得到的RGB數據是從位圖最后一個點開始掃描,直接寫入得到的圖片是倒著的,這時用-height,這樣圖片就正了
bih.biPlanes = 1;//為1,不用改
bih.biBitCount = 24;
bih.biCompression = 0;//不壓縮
bih.biSizeImage = datalen;
bih.biXPelsPerMeter = 0;//2835;//像素每米
bih.biYPelsPerMeter = 0;//2835;
bih.biClrUsed = 0;//已用過的顏色,24位的為0
bih.biClrImportant = 0;//每個像素都重要
FILE * fp = fopen(bmp_file, "wb");//創建bmp文件
if (!fp)
return-1;
fwrite(&bfh, 8, 1, fp);//由于linux上4字節對齊,而信息頭大小為54字節,第一部分14字節,第二部分40字節,所以會將第一部分補齊為16自己,直接用sizeof,打開圖片時就會遇到premature end-of-file encountered錯誤
fwrite(&bfh.bfReserved2, sizeof(bfh.bfReserved2), 1, fp);
fwrite(&bfh.bfOffBits, sizeof(bfh.bfOffBits), 1, fp);
fwrite(&bih, sizeof(BMPINFOHEADER_T), 1, fp);
//寫入rgb數據
fwrite(buffer, datalen, 1, fp);
fclose(fp);
delete[]buffer;
版權聲明:
總結
以上是生活随笔為你收集整理的java bmp rgb数组_将RGB数据写入BMP位图文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享一张CAD快捷命令电脑高清壁纸
- 下一篇: 手机聊天记录怎么隐藏加密微信聊天记录怎么