ソフトウェア開発 Win32プログラミング

TIFF画像をビットマップとして読み込む

戻る


TIFF画像をビットマップとして読み込むには、次のような コードを使うとよい。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#include <stdlib.h>
#include <stdio.h>
#include <tiffio.h>

HBITMAP LoadTiffAsBitmap(LPCSTR pszFileName)
{
    TIFF* tif;
    BITMAPINFO bi;
    HBITMAP hbm, hbm32Bpp, hbm24Bpp;
    DWORD *pdwBits, *pdw;
    VOID *pvBits;
    HDC hdc1, hdc2;
    uint16 resunit;

    ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
    bi.bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biPlanes   = 1; 
    bi.bmiHeader.biBitCount = 32;

    hdc1 = CreateCompatibleDC(NULL);
    if (hdc1 == NULL)
        return FALSE;

    hdc2 = CreateCompatibleDC(NULL);
    if (hdc2 == NULL)
    {
        DeleteDC(hdc1);
        return FALSE;
    }

    hbm = NULL;
    tif = TIFFOpen(pszFileName, "r");
    if (tif != NULL)
    {
        uint32 w, h;
        size_t cPixels;
        uint8 r, g, b, a;
        BOOL fOpaque;
        TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
        TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &resunit);
        bi.bmiHeader.biWidth    = w;
        bi.bmiHeader.biHeight   = h;
        cPixels = w * h;
        hbm32Bpp = CreateDIBSection(hdc1, &bi, DIB_RGB_COLORS, 
            (VOID **)&pdwBits, NULL, 0);
        if (hbm32Bpp != NULL)
        {
            if (TIFFReadRGBAImageOriented(tif, w, h, (uint32 *)pdwBits, 
                ORIENTATION_BOTLEFT, 0))
            {
                pdw = pdwBits;
                fOpaque = TRUE;
                while(cPixels--)
                {
                    r = TIFFGetR(*pdw);
                    g = TIFFGetG(*pdw);
                    b = TIFFGetB(*pdw);
                    a = TIFFGetA(*pdw);
                    if (a != 255)
                        fOpaque = FALSE;
                    *pdw++ = (uint32)b | (((uint32)g) << 8) | 
                        (((uint32)r) << 16) | (((uint32)a) << 24);
                }
                if (fOpaque)
                {
                    bi.bmiHeader.biBitCount = 24;
                    hbm24Bpp = CreateDIBSection(hdc2, &bi, DIB_RGB_COLORS,
                        &pvBits, NULL, 0);
                    if (hbm24Bpp != NULL)
                    {
                        HGDIOBJ hbmOld1 = SelectObject(hdc1, hbm32Bpp);
                        HGDIOBJ hbmOld2 = SelectObject(hdc2, hbm24Bpp);
                        BitBlt(hdc2, 0, 0, w, h, hdc1, 0, 0, SRCCOPY);
                        SelectObject(hdc1, hbmOld1);
                        SelectObject(hdc2, hbmOld2);
                        hbm = hbm24Bpp;
                        DeleteObject(hbm32Bpp);
                    }
                }
                else
                {
                    hbm = hbm32Bpp;
                }
            }
        }
        TIFFClose(tif);
    }
    DeleteDC(hdc1);
    DeleteDC(hdc2);
    
    return hbm;
}

#ifdef UNITTEST
typedef struct tagBITMAPINFOEX
{
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD          bmiColors[256];
} BITMAPINFOEX, FAR * LPBITMAPINFOEX;

BOOL SaveBitmapToFile(LPCTSTR pszFileName, HBITMAP hbm)
{
    ...
}

int main(int argc, char **argv)
{
    HBITMAP hbm;
    WIN32_FIND_DATA find;
    HANDLE hFind;
    
    hFind = FindFirstFile("*.tif", &find);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do 
        {
            hbm = LoadTiffAsBitmap(find.cFileName);
            printf("%s\n", find.cFileName);
            lstrcat(find.cFileName, ".bmp");
            SaveBitmapToFile(find.cFileName, hbm);
        } while(FindNextFile(hFind, &find));
        FindClose(hFind);
    }
    return 0;
}
#endif  /* def UNITTEST */

なお、このコードをコンパイルするには、tiffライブラリが必要だ。

ソース: loadtiff.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system