L_ConvertBufferExt

#include "l_bitmap.h"

L_INT EXT_FUNCTION L_ConvertBufferExt(pBuffer, nWidth, nBitsPerPixelSrc, nBitsPerPixelDst, nOrderSrc, nOrderDst, pPaletteSrc, pPaletteDst, uFlags, uLowBit, uHighBit)

L_UCHAR L_FAR * pBuffer;

/* pointer to the input buffer */

L_INT nWidth;

/* image width, in pixels */

L_INT nBitsPerPixelSrc;

/* input bits per pixel */

L_INT nBitsPerPixelDst;

/* output bits per pixel */

L_INT nOrderSrc;

/* input color order */

L_INT nOrderDst;

/* output color order */

LPRGBQUAD pPaletteSrc;

/* pointer to the palette for the existing data */

LPRGBQUAD pPaletteDst;

/* pointer to the palette for the converted data */

L_UINT uFlags;

/* option flags */

L_INT uLowBit;

/* low bit */

L_INT uHighBit;

/* high bit */

Converts data in the specified buffer to the specified bits per pixel and color order. You can convert from any bits per pixel to any bits per pixel.

Parameter

Description

pBuffer

Pointer to the input buffer.

nWidth

Image width, in pixels.

nBitsPerPixelSrc

Input bits per pixel. Possible values are 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32, 48, and 64.

nBitsPerPixelDst

Output bits per pixel. Use 0 for 8-bit grayscale.

nOrderSrc

The input color order. Possible values are:

 

Value

Meaning

 

ORDER_RGB

[0] The input colors are in red-green-blue order.

 

ORDER_BGR

[1] The input colors are in blue-green-red order.

 

ORDER_GRAY

[2] The input is grayscale.

 

ORDER_ROMM

[5] The input colors are in ROMM order. ROMM only supports 24 and 48-bit images.

 

0

The data is 8 bits per pixel or less.

nOrderDst

The output color order. Possible values are:

 

Value

Meaning

 

ORDER_RGB

[0] The output colors are in red-green-blue order.

 

ORDER_BGR

[1] The output colors are in blue-green-red order.

 

ORDER_GRAY

[2] The output is grayscale.

 

ORDER_ROMM

[5] The output colors are in ROMM order. ROMM only supports 24 and 48-bit images.

 

0

The data is 8 bits per pixel or less.

pPaletteSrc

Pointer to the palette for the existing data, before conversion. If the data is converted from 16 or 24 bits per pixel, use NULL for no palette.

pPaletteDst

Pointer to the palette for the converted data. If the data is converted to 16 or 24 bits per pixel color, use NULL for no palette.

uFlags

Flags indicating whether to treat 16 bit data as grayscale or color. Possible values are:

 

Value

Meaning

 

CVT_SRCGRAY

[0x0001] Source buffer has grayscale data.

 

CVT_DSTGRAY

[0x0002] Destination buffer has grayscale data.

 

CVT_SRCUSEBITS

[0x0003] uLowBit and uHighBit apply to the source bitmap.

 

CVT_SRCDSTBITS

[0x0004] uLowBit and uHighBit apply to the destination bitmap.

 

CVT_ALPHAINIT

[0x0020] Initialize the alpha channel (for 32 or 64 bit color images) to all ones (0xFF for 8-bit alpha channels and 0xFFFF for 16-bit alpha channels).  Without this flag, a created alpha channel initializes to zeros.

uLowBit

Value indicating the low bit in the source buffer, if the source buffer contains grayscale data.

uHighBit

Value indicating the high bit in the source buffer, if the source buffer contains grayscale data.

Returns

SUCCESS

The function was successful.

< 1

An error occurred. Refer to Return Codes.

Comments

Note: This function will also work for 12 and 16-bit grayscale images, but only in the Document/Medical Imaging editions . If you attempt to use this function with a 12 or 16-bit grayscale image, but you do not have a Medical Imaging edition , you will receive an error.

The conversion uses only one buffer, which must be large enough to hold the data before and after conversion.

Image data that is 8 bits per pixel or less must use a palette, and this function can use such data as input, output, or both. Therefore, you may need to specify the palette for the input, or for the output, or both.

If either nBitsPerPixelSrc or nBitsPerPixelDst is 16, uFlags is used to determine whether the data should be treated as color or grayscale.

If nBitsPerPixelSrc is 12, it is assumed to be grayscale. However, the uFlags parameter should also reflect that it is grayscale for future compatibility.

If the source is grayscale, pPaletteSrc can be set to a palette. The palette should contain N entries. If the source uses uLowBit and uHighBit, then N equals 2 raised to the power of (uHighBit - uLowBit + 1). Otherwise, N equals 2 raised to the power of nBitsPerPixelSrc.

uFlags supersedes nOrderSrc and nOrderDst. If you specify ORDER_BGR for nOrderSrc, but use CVT_SRCGRAY in uFlags, it will be assumed that the source buffer contains grayscale data.

Required DLLs and Libraries

LTKRN

For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application.

Platforms

Windows 95 / 98 / Me, Windows 2000 / XP, Windows CE.

See Also

Functions:

L_ConvertBuffer

Topics:

Raster Image Functions: Doing Color Space Conversions, Raster Image Functions: Doing Color Expansion or Reduction

Example

This example loads a temporary bitmap at 24 bits per pixel, creates a new 16-bit grayscale image, and uses L_ConvertBuffer to convert data from the temporary bitmap to the new one.

BITMAPHANDLE LeadBitmap;   /* Bitmap handle for the final image */

void TestFunction(HWND hWnd, pBITMAPHANDLE pBitmap)
{
   BITMAPHANDLE TmpBitmap;   /* Bitmap handle to hold the input image */
   L_UCHAR L_FAR *pBuf; /* Buffer to hold the row */
   HGLOBAL hBuf; /* Handle to the buffer */
   int i; /* Loop counter */

   /* Load the bitmap, at 24 bits per pixel */
   L_LoadBitmap (TEXT("IMAGE3.CMP"), &TmpBitmap, sizeof(BITMAPHANDLE), 24, 0, NULL, NULL);

   
   /* Create a new 16-bit grayscale bitmap */
   L_CreateBitmap(&LeadBitmap, sizeof(BITMAPHANDLE), TYPE_CONV, TmpBitmap.Width, TmpBitmap.Height,
                  16, ORDER_GRAY, NULL, TmpBitmap.ViewPerspective, NULL, 0);

   /* Allocate and lock the buffer */
   hBuf = GlobalAlloc(GMEM_MOVEABLE,max(LeadBitmap.BytesPerLine, TmpBitmap.BytesPerLine));
   pBuf = (L_UCHAR L_FAR *)GlobalLock( hBuf );

   /* Process each row from TmpBitmap to LeadBitmap */
   L_AccessBitmap(&LeadBitmap);
   L_AccessBitmap(&TmpBitmap);
   for(i=0; i < TmpBitmap.Height; i++)
   {
      L_GetBitmapRow(&TmpBitmap, pBuf, i, TmpBitmap.BytesPerLine);
      L_ConvertBufferExt(pBuf, TmpBitmap.Width, 
         TmpBitmap.BitsPerPixel, LeadBitmap.BitsPerPixel,
         TmpBitmap.Order, LeadBitmap.Order, NULL, NULL,
         CVT_DSTGRAY, 0, 15);
      L_PutBitmapRow(&LeadBitmap, pBuf, i, LeadBitmap.BytesPerLine);
   }
   L_ReleaseBitmap(&LeadBitmap);
   L_ReleaseBitmap(&TmpBitmap);

   /* Free memory that we no longer need */
   GlobalUnlock(hBuf);
   GlobalFree(hBuf);
   /* Free the temporary bitmap */
   L_FreeBitmap(&TmpBitmap);

   /* Force paint palette creation */
   SendMessage (hWnd, WM_QUERYNEWPALETTE, 0, 0L);
   return;
}