Build a bitmap from any TIFF file. The code will copy the DIB lines into the bitmap:
BOOL CALLBACK PutTiffIntoBitmap(LPSTR lpszFileName, HWND hWnd, HDC hDC)
{
DIALOGPARM FAR *lpDialogParm;
TIFFFILE hChain;
HANDLE ghDialogParm;
DWORD dwDlgParam;
BOOL bDlgOk, bRetVal;
int nImage, nImgCount;
bRetVal = FALSE;
bDlgOk = TRUE;
hBitmap = NULL;
// Opens the TIFF file.
hChain = OpenTiffFile(lpszFileName,T_READ);
if (hChain != NULL) // Opening OK.
{
int nImgCount = NumberOfTiffImages(hChain, ALLVERSIONS);
if (nImgCount > 1)
{
if ((ghDialogParm=GlobalAlloc( GHND, (LONG) size of(DIALOGPARM))) != NULL)
{
if ((lpDialogParm = (DIALOGPARM FAR *) GlobalLock(ghDialogParm)) !=NULL)
{
lpDialogParm->lpszFile=lpszFileName;
lpDialogParm->wItem=nImgCount;
bRetVal = DialogBoxParam(hInst, "CHOOSETIFF", GetActiveWindow(),
SelectTiffDlgProc, (DWORD)lpDialogParm);
nImage = lpDialogParm->wItem;
GlobalUnlock(ghDialogParm);
GlobalFree(ghDialogParm);
}
}
if (bRetVal > -1 && (nImage > 0 && nImage <= nImgCount))
nImage -= 1;
else
{
// cancelled operation or failed
// Closes TIFF file.
CloseTiffFile(hChain);
return (bRetVal);
}
}
else
{ // there is only one image
nImage = 0;
}
// Registers the nImage-th image.
if (GetTiffImage(hChain, nImage)) // Registering OK.
{
dwDlgParam = ((DWORD)hChain << 16) + nImage;
bDlgOk = DialogBoxParam(hInst, "TiffInfo", NULL, TiffInfoDlgFn, dwDlgParam);
if (bDlgOk)
{
if (bDecodeTo)
// Loads the TIFF image into hBitmap.
bRetVal = LoadTiffToBitmap(hChain, nImage, hWnd, hDC);
else
bRetVal = LoadTiffToScreen(hChain, nImage, hWnd, hDC, NULL,NULL);
} // Loading confirmed.
} // Endif registering image OK.
// Closes TIFF file.
CloseTiffFile(hChain);
} // Endif opening TIFF file OK.
if(bDlgOk && !bRetVal) // Error occurred.
{
MessageBox(NULL,
(LPSTR)"Unable to access data. Loading has failed.",
(LPSTR)"TIFF error",
MB_OK|MB_ICONEXCLAMATION);
}
return(bDlgOk && bRetVal);
}
static BOOL LoadTiffToBitmap( TIFFFILE hChain, int nImage, HWND hWnd,
HDC hDC)
{
FILLPROC lpfnLineProc;
TIFFLINEDATA TiffLineData;
LPBITMAPINFO lpBmI = NULL;
HPALETTE hPal = NULL;
// Displays an hourglass-cursor and saves the original one.
hOldCur = SetCursor(LoadCursor(NULL,IDC_WAIT));
TiffLineData.hBitmap = NULL;
// Retrieves color and dimensions info.
TiffLineData.hBitmapInfo = GetTiffRGBQuad(hChain,nImage);
if (TiffLineData.hBitmapInfo != NULL)
{
SetTiffError(TNOTENOUGHMEMORY); // Error flag default value.
// Gets a DC to be used later in the call back function.
TiffLineData.hDC = hDC;
if (TiffLineData.hDC != NULL)
{
// Creates an empty BITMAP.
lpBmI = (LPBITMAPINFOHEADER) GlobalLock(TiffLineData.hBitmapInfo);
hPal = CreateDibPalette(TiffLineData.hBitmapInfo);
if (hPal) {
SelectPalette(TiffLineData.hDC, hPal, FALSE);
RealizePalette(TiffLineData.hDC);
ConvertRGBToPALIndex(lpBmI);
TiffLineData.wUsage = DIB_PAL_COLORS;
}
else {
TiffLineData.wUsage = DIB_RGB_COLORS;
}
TiffLineData.hBitmap = CreateDIBitmap(TiffLineData.hDC,lpBmI,0L, NULL,NULL, TiffLineData.wUsage);
if (TiffLineData.hBitmap != NULL)
{
TiffLineData.lpBmI = lpBmI = (LPBITMAPINFO) GlobalLock(TiffLineData.hBitmapInfo);
if (lpBmI->bmiHeader.biBitCount!=24) {
lpfnLineProc = FlushTiffLine;
}
else {
TiffLineData.wWidthBytes = ((lpBmI->bmiHeader.biWidth*
lpBmI->bmiHeader.biBitCount+15)/8)&0xfffe;
lpfnLineProc = FlushTiffLine24;
}
// Fills the image in the bitmap.
if (!DecodeTiffImage(hChain,nImage,0, 0,
(LONG)(TIFFLINEDATA far *)&TiffLineData,
lpfnLineProc))
{
if (TiffError() == TENDOFDATA)
{
MessageBox(NULL,
(LPSTR)"Image was smaller that was defined.",
(LPSTR)"TIFF warning",
MB_OK|MB_ICONEXCLAMATION);
}
else // real error.
{
DeleteObject(TiffLineData.hBitmap);
TiffLineData.hBitmap = NULL;
}
}
} // Endif bitmap creation OK.
GlobalUnlock(TiffLineData.hBitmapInfo);
} // Endif retrieving DC OK.
} // Endif retrieving color and dimensions info OK.
// Restores original cursor from hourglass-cursor.
SetCursor(hOldCur);
return(TiffLineData.hBitmap != NULL);
}
The FlushTiffLine() callback function to store each scan line in the bitmap:
int CALLBACK FlushTiffLine(LPSTR lpLineBuff, int nLine, LONG lParam)
{
LPBITMAPINFO lpBmI;
TIFFLINEDATA far * lpTiffLineData = (TIFFLINEDATA far *)lParam;
lpBmI = (LPBITMAPINFO) GlobalLock(lpTiffLineData->hBitmapInfo);
// Writes data into bitmap.
SetDIBits( lpTiffLineData->hDC,lpTiffLineData->hBitmap,
(int)lpBmI->bmiHeader.biHeight - ++nLine,1,
lpLineBuff, (LPBITMAPINFO)lpBmI, DIB_RGB_COLORS);
GlobalUnlock(lpTiffLineData->hBitmapInfo);
return(TOK);
}