windows-nt/Source/XPSP1/NT/printscan/fax/tiff/test/bmp2tiff.c
2020-09-26 16:20:57 +08:00

145 lines
2.5 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
bmp2tiff.c
Abstract:
This file contains support for converting a
Windows BMP file to a TIFF file.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 17-Feb-1996
--*/
#include "test.h"
#pragma hdrstop
DWORD
ConvertBmpToTiff(
LPTSTR BmpFile,
LPTSTR TiffFile,
DWORD CompressionType
)
/*++
Routine Description:
Converts a BMP file to a TIFF file.
Arguments:
BmpFile - BMP file name
TiffFile - TIFF file name
CompressionType - Compression method, see tifflib.h
Return Value:
None.
--*/
{
HANDLE hFileIn;
HANDLE hMapIn;
LPVOID FilePtrIn;
HANDLE hTiff;
PBMPINFO BmpInfo;
DWORD LineWidth;
DWORD FileSize;
LPBYTE Bits;
DWORD i,j;
LPBYTE SrcPtr;
DWORD RealWidth;
BYTE BitBuffer[(1728/8)*2];
hFileIn = CreateFile(
BmpFile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hFileIn != INVALID_HANDLE_VALUE) {
return GetLastError();
}
hMapIn = CreateFileMapping(
hFileIn,
NULL,
PAGE_READONLY | SEC_COMMIT,
0,
0,
NULL
);
if (!hMapIn) {
return GetLastError();
}
FilePtrIn = MapViewOfFile(
hMapIn,
FILE_MAP_READ,
0,
0,
0
);
if (!FilePtrIn) {
return GetLastError();
}
FileSize = GetFileSize( hFileIn, NULL );
BmpInfo = (PBMPINFO) FilePtrIn;
LineWidth = BmpInfo->SizeImage / BmpInfo->Height;
Bits = (LPBYTE) ( (LPBYTE)FilePtrIn + BmpInfo->Offset );
SrcPtr = ((LPBYTE)FilePtrIn + BmpInfo->Offset) + (LineWidth * (BmpInfo->Height - 1));
RealWidth = Align( 8, BmpInfo->Width ) / 8;
hTiff = TiffCreate( TiffFile, CompressionType, LineWidth*8, 1, 1 );
if (!hTiff) {
return GetLastError();
}
TiffStartPage( hTiff );
for (i=0; i<BmpInfo->Height; i++) {
FillMemory( BitBuffer, sizeof(BitBuffer), 0xff );
CopyMemory( BitBuffer, SrcPtr, RealWidth );
if (BmpInfo->Width % 8) {
BitBuffer[BmpInfo->Width/8] |= 0xf;
}
for (j=0; j<sizeof(BitBuffer); j++) {
BitBuffer[j] ^= 0xff;
}
SrcPtr -= LineWidth;
TiffWrite( hTiff, BitBuffer );
}
TiffEndPage( hTiff );
UnmapViewOfFile( FilePtrIn );
CloseHandle( hMapIn );
CloseHandle( hFileIn );
TiffClose( hTiff );
return 0;
}