tiff轉bmp的實現

2021-10-04 22:41:03 字數 2717 閱讀 3444

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...