日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java bmp rgb数组_将RGB数据写入BMP位图文件

發布時間:2024/9/19 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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位图文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。