2007.04.11 12:49 "[Tiff] DC to tiff", by

2007.04.11 12:49 "[Tiff] DC to tiff", by

Anybody know how to print a DC to a tiff file? I can't seem to make it

work..

Code:
BITMAPINFOHEADER *pBMh = NULL;
BITMAPINFO *pBM = NULL;
BYTE *bits;
HBITMAP hBmp;
TIFF *tif;
// Allocate bitmap info header
pBMh =
(BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
if(pBMh == NULL){
return 0;
}

memset(pBMh, 0, sizeof(BITMAPINFOHEADER));
pBMh->biSize = sizeof(BITMAPINFOHEADER);
pBMh->biHeight = GetDeviceCaps(dc, VERTRES);
pBMh->biWidth = ((((int)GetDeviceCaps(dc, HORZRES)*8)+31)&~31)>>3;
pBMh->biBitCount = 24;
pBMh->biPlanes = 1;
pBMh->biCompression = BI_RGB;
// Setup color table for mono DIBs
pBM = (BITMAPINFO*)pBMh;
pBM->bmiColors[1].rgbBlue = 255;
pBM->bmiColors[1].rgbGreen = 255;
pBM->bmiColors[1].rgbRed = 255;
hBmp = CreateDIBSection(dc, (BITMAPINFO*)pBMh, DIB_RGB_COLORS,
(void**)&bits, 0, 0);
if(!hBmp || !bits){
free(pBMh);
return(0);
}

// get the image information from the provided DIB
UINT32 height = pBMh->biHeight;
UINT32 width = pBMh->biWidth;
UINT32 bitcount = (UINT32)pBMh->biBitCount;
UINT32 bytecount = bitcount / 8;
free(pBMh);
if((width > 0) && (height > 0)){
// open the output TIFF image for writing
if((tif = TIFFOpen(achFile, "w")) == NULL)
return 0;
}

// set up the image tags

TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);

TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);

TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);

TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS);

TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);

TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);

TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);

TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);

TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);

TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);

unsigned char * psrc = (unsigned char *)bits;

unsigned char * pdst = new unsigned char[(width * 3)];

UINT32 src_index=0;

UINT32 dst_index=0;

// now go line by line to write out the image data

for(UINT32 row = 0; row < height; row++ ){

// initialize the scan line to zero

memset(pdst,0,(size_t)(width * 3));

// moving the data from the dib to a row structure that

// can be used by the tiff library

for(UINT32 col = 0; col < (UINT32)width; col++){

src_index=(width-row-1)*width*bytecount+col*bytecount;

dst_index = col*3;

pdst[dst_index++]=psrc[src_index+2];

pdst[dst_index++]=psrc[src_index+1];

pdst[dst_index]=psrc[src_index];

}

// now actually write the row data

TIFFWriteScanline(tif, pdst, row, 0);

}

TIFFClose(tif);

return 1;