Decode into a Bitmap - Example 1

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);

}