tiff檔案格式內容見之前的文章
本次實驗,自己用ps做了乙個160*90的未壓縮影象,預覽圖如下
由於rgb本身就是倒著存的,希望得到乙個倒過來的影象
黑底白字便於對著二進位制檔案找錯,實現如下:
該檔案裡宣告了轉換為bmp所要用的檔案頭和資訊頭
#ifndef header_h
#define header_h
#include"stdafx.h"
#include#include#include#pragma pack(2)
class bmpheader ;//檔案頭
class bmpinfo ;//資訊頭
int rgb2bmp(bmpheader*, bmpinfo*);
#endif // !header_h
#pragma pack(2)用來防止結構體自動對齊,之前沒注意這回事讓我的bmp檔案頭出錯,無法開啟
另外這裡偷懶,沒有從tiff對應的目錄項裡讀取長寬和色彩格式,在宣告時就定義了,讀取的實現和下文中讀取影象資料過程相似
#include"header.h"
using namespace std;
const char*pathin = "pic.tif";
const char*pathout = "pic.rgb";
unsigned char*buffer = new unsigned char[12];
int main()
int offset = 0;//檔案目錄的偏移量
offset = (buffer[7] << 24) + (buffer[6] << 16) + (buffer[5] << 8) + buffer[4];
in.seekg(offset);
in.read((char*)buffer, 2);
unsigned int package_num = buffer[0] + (buffer[1] << 8);
class package
;//定義了目錄項
package*a= new package[package_num];
head.type = 0x4d42;
head.size = 160 * 90 * 3 + 54;
head.offbit = 54;
info.size = 40;
手動定義了bmp檔案頭里的資料,對目錄項的類定義也完成,接下來可以開始處理資料了
for (int i = 0; i < package_num; i++)
for (int j = 0; j < 2; j++)
for (int j = 0; j < 4; j++)
if (a[i].tag_id[0]== 17&&a[i].tag_id[1]==01)
if (a[i].tag_id[0] ==23&&a[i].tag_id[1]==01)
unsigned int length = (a[i].data[3] << 24) + (a[i].data[2] << 16) + (a[i].data[1] << 8) + a[i].data[0];
unsigned char*data = new unsigned char[length];
in.seekg(off_img);
in.read((char*)data, length);
for (int i = 0; i < length; i = i + 3)
}out.write((char*)data, length);
out.close();
in.seekg((i+1)*12+2+offset, ios::beg);
} }in.close();
rgb2bmp(&head, &info);
system("pause");
return 0;
把資料從buffer裡讀出來以後進行判斷,這裡沒有讀取所有的目錄項,只讀取了需要的0111和0117項,這裡為16進製制,**中為10進製,上面只是把tiff的影象資料讀了出來,目前檔案還是rgb的狀態,預覽如下
可見,影象剛好是原圖倒過來,與預期的一樣
接下來轉換成bmp
#include"stdafx.h"
#include"header.h"
using namespace std;
const char*pathrgb = "pic.rgb";
const char*pathbmp = "pic.bmp";
unsigned char*bufferrgb = new unsigned char[160 * 90 * 3 ];
int rgb2bmp(bmpheader*a,bmpinfo*b)
這裡由於本次使用的影象的真彩色影象所以沒有調色盤資訊
再來看看bmp影象
與預期一樣
bmp彩色轉灰度
一 基礎 對於彩色轉灰度,有乙個很著名的心理學公式 gray r 0.299 g 0.587 b 0.114 二 整數演算法 而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法 gray r 299 g 587 b...
yuv420 轉bmp的方法
yuv420 轉bmp的方法 我找到了乙個c寫的exe 但是c的水平我實在是不敢去修改那個原始碼,所以我乾脆就呼叫這個dll,在c 裡建立了下面這個類,然後呼叫 y2b.exe 來轉換,而且不會顯示出來那個黑屏.要知道怎麼回事,就看 吧 呵呵.using system using system.co...
乙個yuv轉bmp的程式
在黑客中國上找到的,執行除錯後,可以使用,如下 include stdafx.h include include include include include define byte unsigned char define bool bool define dword unsigned long...