TIFF 由四部分組成:
ByteOrder (II=Intel, MM=Motorola)、Version (固定 42)、IFDOffset (首個 IFD 相對偏移)DECount (目錄項數)、N 個 DE (Directory Entry)、NextIFDOffset (下一 IFD 偏移,0 表示結束)Tag (屬性標識)、Type (數據類型: 1=BYTE, 2=ASCII, 3=SHORT, 4=LONG, 5=RATIONAL)、Length (數據項數)、ValueOffset (數據值或偏移,≤4 字節直接存值)| Tag | 含義 |
|---|---|
| 256 | ImageWidth |
| 257 | ImageLength |
| 273 | StripOffsets (數據偏移) |
| 277 | SamplesPerPixel |
| 278 | RowsPerStrip |
IFH ifh; file.Read(&ifh, sizeof(IFH)); if (ifh.version != 0x2A || ifh.byteOrder != 0x4949) return FALSE; // 僅支援 Intel 小端 file.Seek(ifh.offsetToIFD, CFile::begin);
WORD deCount; file.Read(&deCount, 2); DE* pde = new DE[deCount]; file.ReadHuge(pde, sizeof(DE)*deCount); // 遍歷 pde 獲取寬高、數據偏移等
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);
}
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);
測試文件 SSS00.TIF 隨源碼提供。開發環境:VC6.0 MFC 單文檔程序。