Initializes the buffered decompression engine. The decompression is then carried out using the L_DecompressBuffer function. It is ended by the L_StopDecompressBuffer function.
#include "l_bitmap.h"
L_LTFIL_API L_INT L_StartDecompressBuffer(phDecompress, pStartDecompressData)
Pointer to the handle that identifies the decompression process.
Pointer to a structure that contains information about the decompression process.
| Value | Meaning |
|---|---|
| SUCCESS | The function was successful. |
| < 1 | An error occurred. Refer to Return Codes. |
You must declare a handle of type HGLOBAL before calling this function. Pass the address of this handle to this function and the function will initialize the handle.
If this function is called for an unsupported format, it will return ERROR_INV_PARAMETER.
Currently, raw JPEG must contain all the Huffman tables encoded. That is, it must be a readable JPEG file.
Win32, x64, Linux.
#include <fcntl.h>#include <io.h>#include <Tchar.h>#define TAG_STRIPOFFSETS 0x111#define TAG_STRIPBYTECOUNTS 0x117#define TAG_ROWSPERSTRIP 0x116#define MAX_STRIPS 1000// Returns maximum indexL_INT ReadTag(L_TCHAR *pszFileName, L_UINT16 uTag, L_INT StripArray[]){L_UINT16 uType;L_UINT32 uCount;L_ReadFileTag(pszFileName, uTag, &uType, &uCount, StripArray, NULL);return uCount;}// Example 1// This sample loads raw data from packbits.tif// packbits.tif is a 24-bit tif packbits compressed file// packbits.tif has 46 strips of packbits data// The strip information is obtained by reading the TIF tags TAG_STRIPOFFSETS and TAG_STRIPBYTECOUNTS// The strips are directly read and fed to the L_Compress APIsL_INT StartDecompressBufferFirstExample(L_VOID){L_INT nRet;L_TCHAR *szFileName = MAKE_IMAGE_PATH("packbits.tif");L_HANDLE fd;L_UCHAR *pBuf = NULL;BITMAPHANDLE Bitmap;FILEINFO TempFileInfo;L_INT nRowsPerStrip=0;STARTDECOMPRESSDATA StartDecompressData;DECOMPRESSDATA DecompressData;L_INT nIndex = 0;HGLOBAL hDecompress;L_INT StripOffsets[MAX_STRIPS];L_INT StripSizes[MAX_STRIPS];L_INT nMaxIndex;DWORD wReadBytes;memset(&TempFileInfo, 0, sizeof(FILEINFO));TempFileInfo.uStructSize = sizeof(TempFileInfo);nRet = L_FileInfo (szFileName, &TempFileInfo, sizeof(FILEINFO), 0, NULL);if(nRet != SUCCESS)return nRet;//******************************//*** L_StartDecompressBuffer//******************************memset(&StartDecompressData, 0, sizeof(STARTDECOMPRESSDATA) );memset(&DecompressData, 0, sizeof(DECOMPRESSDATA) );StartDecompressData.uStructSize = sizeof(STARTDECOMPRESSDATA);StartDecompressData.pBitmap = &Bitmap;StartDecompressData.uBitmapStructSize = sizeof(BITMAPHANDLE);StartDecompressData.uStripsOrTiles = DECOMPRESS_STRIPS;StartDecompressData.uFormat = FILE_RAW_PACKBITS;StartDecompressData.nWidth = TempFileInfo.Width;StartDecompressData.nHeight = TempFileInfo.Height;StartDecompressData.nBitsPerPixel = TempFileInfo.BitsPerPixel;StartDecompressData.nViewPerspective = TempFileInfo.ViewPerspective;StartDecompressData.nRawOrder = TempFileInfo.Order;StartDecompressData.nLoadOrder = ORDER_BGRORGRAY;StartDecompressData.nXResolution = TempFileInfo.XResolution;StartDecompressData.nYResolution = TempFileInfo.YResolution;StartDecompressData.pfnReadCallback = NULL;StartDecompressData.uFlags = 0;StartDecompressData.pUserData = NULL;StartDecompressData.nPhotoInt = 2; // TIFF tag 0-6 WhiteIsZero(0) BlackIsZero(1) RGB(2)nRet = L_StartDecompressBuffer(&hDecompress, &StartDecompressData);if(nRet != SUCCESS)return nRet;//******************************//*** L_DecompressBuffer//******************************nMaxIndex = ReadTag(szFileName, TAG_STRIPOFFSETS, StripOffsets);ReadTag(szFileName, TAG_STRIPBYTECOUNTS, StripSizes);ReadTag(szFileName, TAG_ROWSPERSTRIP, &nRowsPerStrip);fd = CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);DecompressData.nRow = 0;//Note--this field is ignored for stripsfor (nIndex = 0; nIndex < nMaxIndex; nIndex++){//seek to the first stripSetFilePointer(fd,StripOffsets[nIndex] , 0, FILE_BEGIN);pBuf = (L_UCHAR *)malloc(StripSizes[nIndex]);ReadFile (fd, pBuf, StripSizes[nIndex], &wReadBytes, NULL);DecompressData.uStructSize = sizeof(DECOMPRESSDATA);DecompressData.pBuffer = pBuf; //pointer to raw dataDecompressData.nWidth = TempFileInfo.Width; //Width of uncompressed strip/tileDecompressData.nHeight = nRowsPerStrip; //Height of uncompressed strip/tileif (nIndex == (nMaxIndex - 1 )){//fewer rows per stripDecompressData.nHeight = TempFileInfo.Height - (nMaxIndex - 1) * nRowsPerStrip;}DecompressData.uOffset = 0; //Offset of strip relative to bufferDecompressData.nBufferSize = StripSizes[nIndex];//Size of strip after compressionDecompressData.nCol = 0; //Col offset of tileDecompressData.uFlags = DECOMPRESS_CHUNK_COMPLETE;DecompressData.nReserved1 = 0; //Reserved for future usenRet = L_DecompressBuffer ( hDecompress, &DecompressData);if(nRet != SUCCESS)return nRet;free(pBuf);}CloseHandle(fd);//******************************//*** L_StopDecompressBuffer//******************************L_StopDecompressBuffer (hDecompress);// Bitmap contains the uncompressed bitmapnRet = L_SaveBitmap (MAKE_IMAGE_PATH("Uncompressed.bmp"), &Bitmap, FILE_BMP, 24, 0, NULL);L_FreeBitmap(&Bitmap);return nRet;}// Example 2// This sample is similar to LoadRawPackbitsStrips(), except the data// is fed to L_Decompress APIs as tiles instead of strips and the image// created is 4x the size of the original image, consisting of four of the original images// This sample loads raw data from packbits.tif// packbits.tif is a 24-bit tif packbits compressed file// packbits.tif has 46 strips of packbits data// The strip information is obtained by reading the TIF tags TAG_STRIPOFFSETS and TAG_STRIPBYTECOUNTS// The strips are directly read and fed to the L_Compress APIsL_INT StartDecompressBufferSecondExample(){L_INT nRet;L_TCHAR *szFileName = MAKE_IMAGE_PATH("packbits.tif");L_HANDLE fd;L_UCHAR *pBuf = NULL;BITMAPHANDLE Bitmap;FILEINFO TempFileInfo;L_INT nRowsPerStrip=0;STARTDECOMPRESSDATA StartDecompressData;DECOMPRESSDATA DecompressData;L_INT nIndex = 0;HGLOBAL hDecompress;L_INT nCurrentRow = 0;L_INT StripOffsets[MAX_STRIPS];L_INT StripSizes[MAX_STRIPS];L_INT nMaxIndex;DWORD wReadBytes;memset(&TempFileInfo, 0, sizeof(FILEINFO));TempFileInfo.uStructSize = sizeof(TempFileInfo);nRet = L_FileInfo (szFileName, &TempFileInfo, sizeof(FILEINFO), 0, NULL);if(nRet != SUCCESS)return nRet;//******************************//*** nRet = L_StartDecompressBuffer//******************************memset(&StartDecompressData, 0, sizeof(STARTDECOMPRESSDATA) );memset(&DecompressData, 0, sizeof(DECOMPRESSDATA) );StartDecompressData.uStructSize = sizeof(STARTDECOMPRESSDATA); // For versioningStartDecompressData.pBitmap = &Bitmap;StartDecompressData.uBitmapStructSize = sizeof(BITMAPHANDLE);StartDecompressData.uStripsOrTiles = DECOMPRESS_TILES;StartDecompressData.uFormat = FILE_RAW_PACKBITS;StartDecompressData.nWidth = TempFileInfo.Width * 2; //StartDecompressData.nHeight = TempFileInfo.Height * 2; //StartDecompressData.nBitsPerPixel = TempFileInfo.BitsPerPixel; //StartDecompressData.nViewPerspective = TempFileInfo.ViewPerspective; //StartDecompressData.nRawOrder = TempFileInfo.Order; // ORDER_RGB, ORDER_BGRStartDecompressData.nLoadOrder = ORDER_BGRORGRAY; // ORDER_RGB, ORDER_BGRStartDecompressData.nXResolution = TempFileInfo.XResolution;StartDecompressData.nYResolution = TempFileInfo.YResolution;StartDecompressData.pfnReadCallback = NULL; // optional callback functionStartDecompressData.uFlags = 0; // DECOMPRESS_LSB, DECOMPRESS_PAD4, DECOMPRESS_WHITEONBLACK, DECOMPRESS_PALETTEStartDecompressData.pUserData = NULL; //StartDecompressData.nPhotoInt = 2; // TIFF tag 0-6 WhiteIsZero(0) BlackIsZero(1) RGB(2)//StartDecompressData.nPlanarConfig; // TIFF tag 1 = Chunky, 2 = Planar formatnRet = L_StartDecompressBuffer(&hDecompress, &StartDecompressData);if(nRet != SUCCESS)return nRet;//******************************//*** L_DecompressBuffer//******************************nMaxIndex = ReadTag(szFileName, TAG_STRIPOFFSETS, StripOffsets);ReadTag(szFileName, TAG_STRIPBYTECOUNTS, StripSizes);ReadTag(szFileName, TAG_ROWSPERSTRIP, &nRowsPerStrip);fd= CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);nCurrentRow = 0;for (nIndex = 0; nIndex < nMaxIndex; nIndex++){//seek to the first stripSetFilePointer(fd, StripOffsets[nIndex], 0, FILE_BEGIN);pBuf = (L_UCHAR *)malloc(StripSizes[nIndex]);ReadFile(fd, pBuf, StripSizes[nIndex], &wReadBytes, NULL);DecompressData.uStructSize = sizeof(DECOMPRESSDATA);DecompressData.pBuffer = pBuf; //pointer to raw dataDecompressData.nWidth = TempFileInfo.Width; //Width of uncompressed strip/tileDecompressData.nHeight = nRowsPerStrip; //Height of uncompressed strip/tileif (nIndex == (nMaxIndex - 1 )){//fewer rows per stripDecompressData.nHeight = TempFileInfo.Height - (nMaxIndex - 1) * nRowsPerStrip;}DecompressData.uOffset = 0; //Offset of strip relative to bufferDecompressData.nBufferSize = StripSizes[nIndex]; //Size of strip after compressionDecompressData.nRow = nCurrentRow; //Row offset of tileDecompressData.nCol = 0; //Col offset of tileDecompressData.uFlags = DECOMPRESS_CHUNK_COMPLETE;DecompressData.nReserved1 = 0; //Reserved for future use//Strips in upper left cornernRet = L_DecompressBuffer ( hDecompress, &DecompressData);if(nRet != SUCCESS)return nRet;//Strips in upper right cornerDecompressData.nRow = nCurrentRow;DecompressData.nCol = TempFileInfo.Width;L_DecompressBuffer( hDecompress, &DecompressData);//Strips in lower left cornerDecompressData.nRow = TempFileInfo.Height + nCurrentRow;DecompressData.nCol = 0;L_DecompressBuffer( hDecompress, &DecompressData);//Strips in lower right cornerDecompressData.nRow = TempFileInfo.Height + nCurrentRow;DecompressData.nCol = TempFileInfo.Width;nRet = L_DecompressBuffer( hDecompress, &DecompressData);if(nRet != SUCCESS)return nRet;free(pBuf);nCurrentRow += DecompressData.nHeight;}CloseHandle(fd);//******************************//*** L_StopDecompressBuffer//******************************L_StopDecompressBuffer(hDecompress);// Bitmap contains the uncompressed bitmapnRet = L_SaveBitmap(MAKE_IMAGE_PATH("Uncompressed.bmp"), &Bitmap, FILE_BMP, 24, 0, NULL);L_FreeBitmap(&Bitmap);return nRet;}// Example 3// This sample loads raw data from OCR1.tif// This file is a tif ccitt group4 compressed with a single strip// The strip information is obtained by reading the TIF tags TAG_STRIPOFFSETS and TAG_STRIPBYTECOUNTS// The strip is directly read and fed to the L_Decompress APIsL_INT StartDecompressBufferThirdExample(){L_INT nRet;L_TCHAR *szFileName = MAKE_IMAGE_PATH("OCR1.tif");L_HANDLE fd;L_UCHAR *pBuf = NULL;BITMAPHANDLE Bitmap;FILEINFO TempFileInfo;L_INT nRowsPerStrip=0;STARTDECOMPRESSDATA StartDecompressData;DECOMPRESSDATA DecompressData;L_INT nIndex = 0;HGLOBAL hDecompress;L_INT StripOffsets[MAX_STRIPS];L_INT StripSizes[MAX_STRIPS];L_INT nMaxIndex;DWORD wReadBytes;memset(&TempFileInfo, 0, sizeof(FILEINFO));TempFileInfo.uStructSize = sizeof(TempFileInfo);nRet = L_FileInfo(szFileName, &TempFileInfo, sizeof(FILEINFO), 0, NULL);if(nRet != SUCCESS)return nRet;//******************************//*** L_StartDecompressBuffer//******************************memset(&StartDecompressData, 0, sizeof(STARTDECOMPRESSDATA) );memset(&DecompressData, 0, sizeof(DECOMPRESSDATA) );StartDecompressData.uStructSize = sizeof(STARTDECOMPRESSDATA);StartDecompressData.pBitmap = &Bitmap;StartDecompressData.uBitmapStructSize = sizeof(BITMAPHANDLE);StartDecompressData.uStripsOrTiles = DECOMPRESS_TILES;StartDecompressData.uFormat = FILE_FAX_G3_1D;StartDecompressData.nWidth = TempFileInfo.Width;StartDecompressData.nHeight = TempFileInfo.Height;StartDecompressData.nBitsPerPixel = TempFileInfo.BitsPerPixel;StartDecompressData.nViewPerspective = TempFileInfo.ViewPerspective;StartDecompressData.nRawOrder = TempFileInfo.Order; // ORDER_RGB, ORDER_BGRStartDecompressData.nLoadOrder = ORDER_BGRORGRAY;StartDecompressData.nXResolution = TempFileInfo.XResolution;StartDecompressData.nYResolution = TempFileInfo.YResolution;StartDecompressData.pfnReadCallback = NULL;StartDecompressData.uFlags = 0;StartDecompressData.pUserData = NULL; //StartDecompressData.nPhotoInt = 0; // TIFF tag 0-6 TIFF tag 0=WhiteIsZero, 1=BlackIsZeronRet = L_StartDecompressBuffer(&hDecompress, &StartDecompressData);if(nRet != SUCCESS)return nRet;//******************************//*** L_DecompressBuffer//******************************nMaxIndex = ReadTag(szFileName, TAG_STRIPOFFSETS, StripOffsets);nMaxIndex = ReadTag(szFileName, TAG_STRIPBYTECOUNTS, StripSizes);ReadTag(szFileName, TAG_ROWSPERSTRIP, &nRowsPerStrip);fd= CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);DecompressData.nRow = 0; //This field is ignored with stripsfor (nIndex = 0; nIndex < nMaxIndex; nIndex++){//seek to the first stripSetFilePointer(fd, StripOffsets[nIndex], 0, FILE_BEGIN);pBuf = (L_UCHAR *)malloc(StripSizes[nIndex]);ReadFile(fd, pBuf, StripSizes[nIndex], &wReadBytes, NULL);DecompressData.uStructSize = sizeof(DECOMPRESSDATA);DecompressData.pBuffer = pBuf; //pointer to raw dataDecompressData.nWidth = TempFileInfo.Width; //Width of uncompressed strip/tileDecompressData.nHeight = nRowsPerStrip; //Height of uncompressed strip/tileif (nIndex == (nMaxIndex - 1 )){//fewer rows per stripDecompressData.nHeight = TempFileInfo.Height - (nMaxIndex - 1) * nRowsPerStrip;}DecompressData.uOffset = 0; //Offset of strip relative to bufferDecompressData.nBufferSize = StripSizes[nIndex];//Size of strip after compressionDecompressData.nCol = 0; //Col offset of tileDecompressData.uFlags = DECOMPRESS_CHUNK_COMPLETE;DecompressData.nReserved1 = 0; //Reserved for future usenRet = L_DecompressBuffer( hDecompress, &DecompressData);if(nRet != SUCCESS)return nRet;free(pBuf);}CloseHandle(fd);//******************************//*** L_StopDecompressBuffer//******************************L_StopDecompressBuffer(hDecompress);// Bitmap contains the uncompressed bitmapnRet = L_SaveBitmap(MAKE_IMAGE_PATH("Uncompressed.bmp"), &Bitmap, FILE_BMP, 24, 0, NULL);L_FreeBitmap(&Bitmap);return nRet;}