首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

TIFF 圖像文件格式解析與轉 BMP 實戰

     編輯:關於VC++

TIFF 文件結構

TIFF 由四部分組成:

  1. IFH (Image File Header):8 字節。ByteOrder (II=Intel, MM=Motorola)、Version (固定 42)、IFDOffset (首個 IFD 相對偏移)
  2. IFD (Image File Directory):可變長。DECount (目錄項數)、N 個 DE (Directory Entry)、NextIFDOffset (下一 IFD 偏移,0 表示結束)
  3. DE (Directory Entry):12 字節。Tag (屬性標識)、Type (數據類型: 1=BYTE, 2=ASCII, 3=SHORT, 4=LONG, 5=RATIONAL)、Length (數據項數)、ValueOffset (數據值或偏移,≤4 字節直接存值)
  4. Image Data:像素數據,本例為 8 位灰度 (256 級),每字節一像素

關鍵 Tag 對照

Tag含義
256ImageWidth
257ImageLength
273StripOffsets (數據偏移)
277SamplesPerPixel
278RowsPerStrip

轉換流程實現

1. 讀取 IFH 驗證格式

IFH ifh; file.Read(&ifh, sizeof(IFH));
if (ifh.version != 0x2A || ifh.byteOrder != 0x4949) return FALSE; // 僅支援 Intel 小端
file.Seek(ifh.offsetToIFD, CFile::begin);

2. 讀取 IFD 解析屬性

WORD deCount; file.Read(&deCount, 2);
DE* pde = new DE[deCount];
file.ReadHuge(pde, sizeof(DE)*deCount);
// 遍歷 pde 獲取寬高、數據偏移等

3. 構建 BMP 內存結構

m_hDIB = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
    sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD) + imgSize);
BYTE* pDIB = (BYTE*)GlobalLock(m_hDIB);

// 填寫 BITMAPFILEHEADER
// 填寫 BITMAPINFOHEADER (biBitCount=8, biClrUsed=256)
// 構建 256 級灰度調色板 RGBQUAD[i] = {i,i,i,0}
// 像素數據垂直翻轉複製 (BMP 底部優先)
for (int y = height-1; y >= 0; --y) {
    file.Seek(sizeof(IFH) + y*width, CFile::begin);
    file.Read(pData + (height-1-y)*width, width);
}

4. 顯示

CPalette pal; // 從灰度調色板創建
pDC->SelectPalette(&pal, TRUE); pDC->RealizePalette();
::StretchDIBits(hdc, x, y, w, h, 0, 0, w, h, pData, (BITMAPINFO*)pInfo, DIB_RGB_COLORS, SRCCOPY);

限制與擴展

  • 本例僅處理未壓縮、單條帶、8 位灰度、Intel 字節序 TIFF
  • 擴展方向:支援壓縮 (LZW/PackBits)、多條帶、RGB/CMYK、Big-endian、自定義 Tag

測試文件 SSS00.TIF 隨源碼提供。開發環境:VC6.0 MFC 單文檔程序。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved