/*++ Copyright (c) 1996 Microsoft Corporation Module Name: tiff2bmp.c Abstract: This file contains support for converting a TIFF file to a Windows BMP file. Environment: WIN32 User Mode Author: Wesley Witt (wesw) 17-Feb-1996 --*/ #include "test.h" #include "tiff.h" #include #pragma hdrstop void PrintTheTiff( LPTSTR TiffFile ) { FAX_PRINT_INFO PrintInfo; FAX_CONTEXT_INFOW ContextInfo; LPTSTR FullPath = TEXT("c:\\temp\\thetiff.tif"); DWORD TmpFaxJobId; BOOL Rslt; ZeroMemory( &PrintInfo, sizeof(FAX_PRINT_INFOW) ); PrintInfo.SizeOfStruct = sizeof(FAX_PRINT_INFOW); PrintInfo.OutputFileName = FullPath; ZeroMemory( &ContextInfo, sizeof(FAX_CONTEXT_INFOW) ); ContextInfo.SizeOfStruct = sizeof(FAX_CONTEXT_INFOW); if (!FaxStartPrintJobW( NULL, &PrintInfo, &TmpFaxJobId, &ContextInfo )) { DeleteFile( FullPath ); SetLastError( ERROR_INVALID_FUNCTION ); return; } Rslt = PrintTiffFile( ContextInfo.hDC, TiffFile ); EndDoc( ContextInfo.hDC ); DeleteDC( ContextInfo.hDC ); } DWORD ConvertTiffToBmp( LPTSTR TiffFile, LPTSTR BmpFile ) /*++ Routine Description: Converts a TIFF file to a BMP file. Arguments: TiffFile - TIFF file name BmpFile - BMP file name Return Value: None. --*/ { HANDLE hTiff; HANDLE hBmp; HANDLE hMap; LPVOID fPtr; PBMPINFO BmpInfo; PWINRGBQUAD Palette; LPBYTE dPtr; LPBYTE sPtr; DWORD i,j; LPBYTE BmpData; TIFF_INFO TiffInfo; hTiff = TiffOpen( TiffFile, &TiffInfo, TRUE, FILLORDER_MSB2LSB ); if (!hTiff) { _tprintf( TEXT("could not open tiff file\n") ); return 0; } _tprintf( TEXT("ImageWidth:\t%d\n"),TiffInfo.ImageWidth); _tprintf( TEXT("ImageHeight:\t%d\n"),TiffInfo.ImageHeight); _tprintf( TEXT("PageCount:\t%d\n"),TiffInfo.PageCount); _tprintf( TEXT("Photometric:\t%d\n"),TiffInfo.PhotometricInterpretation); _tprintf( TEXT("ImageSize:\t%d\n"),TiffInfo.ImageSize); _tprintf( TEXT("Compression:\t%d\n"),TiffInfo.CompressionType); _tprintf( TEXT("FillOrder:\t%d\n"),TiffInfo.FillOrder); _tprintf( TEXT("YResolution:\t%d\n"),TiffInfo.YResolution); BmpData = VirtualAlloc( NULL, TiffInfo.ImageHeight * (TiffInfo.ImageWidth / 8), MEM_COMMIT, PAGE_READWRITE ); if (!BmpData) { _tprintf( TEXT("could allocate memory for bmp data\n") ); return 0; } if (!TiffRead( hTiff, BmpData,0 )) { _tprintf( TEXT("could read tiff data\n") ); TiffClose( hTiff ); return 0; } hBmp = CreateFile( BmpFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL ); if (hBmp == INVALID_HANDLE_VALUE) { return 0; } hMap = CreateFileMapping( hBmp, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024*1024*3, // 3 meg NULL ); if (!hMap) { return GetLastError(); } fPtr = MapViewOfFile( hMap, FILE_MAP_WRITE, 0, 0, 0 ); if (!fPtr) { return GetLastError(); } BmpInfo = (PBMPINFO) fPtr; Palette = (PWINRGBQUAD) (BmpInfo + 1); BmpInfo->Type = 0x4d42; BmpInfo->FileSize = sizeof(BMPINFO) + ((TiffInfo.ImageWidth / 8) * TiffInfo.ImageHeight); BmpInfo->Reserved1 = 0; BmpInfo->Reserved2 = 0; BmpInfo->Offset = sizeof(BMPINFO) + (sizeof(WINRGBQUAD) * 2); BmpInfo->Size = sizeof(BMPINFO) - FIELD_OFFSET(BMPINFO,Size); BmpInfo->Width = TiffInfo.ImageWidth; BmpInfo->Height = TiffInfo.ImageHeight; BmpInfo->Planes = 1; BmpInfo->BitCount = 1; BmpInfo->Compression = 0; BmpInfo->SizeImage = (TiffInfo.ImageWidth / 8) * TiffInfo.ImageHeight; BmpInfo->XPelsPerMeter = 0; BmpInfo->YPelsPerMeter = 0; BmpInfo->ClrUsed = 0; BmpInfo->ClrImportant = 0; if (TiffInfo.PhotometricInterpretation) { // // minimum is black. // Palette[1].rgbBlue = 0; Palette[1].rgbGreen = 0; Palette[1].rgbRed = 0; Palette[1].rgbReserved = 0; Palette[0].rgbBlue = 0xff; Palette[0].rgbGreen = 0xff; Palette[0].rgbRed = 0xff; Palette[0].rgbReserved = 0; } else { // // minimum is white // Palette[0].rgbBlue = 0; Palette[0].rgbGreen = 0; Palette[0].rgbRed = 0; Palette[0].rgbReserved = 0; Palette[1].rgbBlue = 0xff; Palette[1].rgbGreen = 0xff; Palette[1].rgbRed = 0xff; Palette[1].rgbReserved = 0; } sPtr = (LPBYTE) (BmpData + ((TiffInfo.ImageHeight-1)*(TiffInfo.ImageWidth/8))); dPtr = (LPBYTE) ((LPBYTE)(Palette + 2)); // // capture the data // for (i=0; i