L_RemapBitmapHue
#include "l_bitmap.h"
L_INT EXT_FUNCTION L_RemapBitmapHue(pBitmap, pMask, pHTable, pSTable, pVTable, uLUTLen)
pBITMAPHANDLE pBitmap; |
/* pointer to the bitmap handle */ |
/* table of 256 bytes identifying valid values in hue table */ | |
/* table of 256 bytes representing the hue lookup table */ | |
/* table of 256 bytes representing the saturation lookup table */ | |
/* table of 256 bytes representing the value lookup table */ | |
L_UINT uLUTLen; |
/* length of the lookup table */ |
Uses a lookup table to change a bitmap's hue values. The saturation and value tables change S and V values only if a particular hue value is marked as non-zero in the pMask table. It is used for all resolutions, including 48 and 64-bit images.
Parameter |
Description |
pMask |
Lookup table that identifies which values in the pHTable, pSTable and pVTable are valid. If pMask[i] is non-zero, then pHTable, pSTable and pVTable are to be used. If pMask[i] is 0 then pHTable, pSTable and pVTable are ignored. If pMask is NULL, all entries in the pHTable, pSTable and pVTable are used. |
pHTable |
Hue look up table. If the pMask table value for a particular pixel hue is non-zero, then the hue is changed to the corresponding entry in pHTable. For example, if a pixel value has a hue of 85 and pMask[85] is non-zero, the hue is changed to pHTable[85]. If pHTable is NULL, the hue of each pixel is unchanged. |
pSTable |
Saturation look up table. If the pMask table value for a particular pixel hue is non-zero, then the saturation is changed to the corresponding entry in pSTable. For example, if a pixel value has a hue of 85 and pMask[85] is non-zero, the saturation is changed to pSTable[85]. If pHTable is NULL, the saturation is changed to pSTable[85]. If pSTable is NULL, the saturation of each pixel is unchanged. |
pVTable |
Value look up table. If the pMask table value for a particular pixel hue is non-zero, then the value is changed to the corresponding entry in pVTable. For example, if a pixel value has a hue of 85 and pMask[85] is non-zero, the value is changed to pVTable[85]. If pHTable is NULL, the value is changed to pVTable[85]. If pVTable is NULL, the value of each pixel is unchanged. |
uLUTLen |
Length of the lookup table. Possible values are: |
|
|
Value |
Meaning |
|
65536 |
16-bit image |
|
4096 |
12-bit image |
|
256 |
8-bit image |
Returns
SUCCESS |
The function was successful. |
< 1 |
An error occurred. Refer to Return Codes. |
Comments
This function can be used to change a range of colors to another range of colors. For example, it could be used to change all red pixels to any color, where a red pixel can have any brightness (V) and any amount of white (saturation). A red pixel in this case would be
RGB(x,y,y) where
0<=x<(uLUTLen – 1) and
0<=y<x
or in the HSV color space
HSV(0,x,x) where
0<=x<=(uLUTLen – 1)
The pMask lookup table identifies which values in the pHTable are valid. If a pMask value is 0, then the corresponding value in the pHTable is ignored. If a pMask value is non-zero, then the corresponding value in the pHTable is used. For example, if a pixel has a hue value of 240 and pMask[240] is nonzero, then the hue value of 240 is replaced with pHTable[240]. Traditionally, hue ranges from 0 to 359. For the lookup table, the range of 0 to 359 is remapped to a range of 0.. uLUTLen – 1. For example, if uLUTLen = 256
This function does not support signed data images. It returns the error code ERROR_SIGNED_DATA_NOT_SUPPORTED if a signed data image is passed to this function.
Color |
Hue(0..359) |
Hue(0..255) |
Red |
0 |
0 |
Green |
120 |
85 |
Blue |
240 |
170 |
To update a status bar or detect a user interrupt during execution of this function, refer to L_SetStatusCallback.
Use L_RGBtoHSV() and L_HSVtoRGB to convert between RGB and HSV colorspace.
This function supports 48 and 64-bit colored images.
Required DLLs and Libraries
LTIMG 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.
See Also
Example
// This example changes all green hues (and hues near green) to the hue of crNewColor
// The example uses the following macros:
#define INCREMENT(x, uLUTLen) ((x+1)% uLUTLen)
#define DECREMENT(x, uLUTLen) ((x+ (uLUTLen – 1))% uLUTLen)
#define ADD(x,y, uLUTLen) ((x+y)% uLUTLen)
L_INT TestFunction(pBITMAPHANDLE pBitmap, COLORREF crNewColor)
{
L_UINT L_FAR * uMaskTable;
L_UINT L_FAR * uHueTable;
HSVREF hsvRef;
L_UINT uHueGreen, uHueChange;
L_INT iHueChange;
L_INT i, iCount, nRet, uLUTLen;
if(pBitmap->BitsPerPixel >= 48)
uLUTLen = 0x10000;
else if(!ISGRAY(pBitmap))
uLUTLen = 256;
else if(pBitmap->pLUT && pBitmap->Flags.UseLUT)
uLUTLen = 256;
else
uLUTLen = (1 << pBitmap->BitsPerPixel);
//Allocate tables
uMaskTable = malloc (uLUTLen * sizeof(L_UINT));
uHueTable = malloc (uLUTLen * sizeof(L_UINT));
//Initialize tables
for (i=0; i<uLUTLen; i++)
{
uMaskTable[i] = 0;
uHueTable[i] = i;
}
//Get the hue for green
hsvRef = L_RGBtoHSV(RGB(0,255,0));
uHueGreen = hsvRef.uH;
//Obtain new hue
hsvRef = L_RGBtoHSV(crNewColor);
iHueChange = (L_INT)hsvRef.uH - (L_INT)uHueGreen;
uHueChange = (iHueChange>0) ? (L_UINT)iHueChange : (L_UINT)(iHueChange + (uLUTLen – 1));
uHueGreen *= (uLUTLen - 1)/255;
uHueChange *= (uLUTLen - 1)/255;
//Set values in uHueTable, uMaskTable
uHueTable[uHueGreen] = (uHueTable[uHueGreen] + uHueChange);
uMaskTable[uHueGreen] = 1;
//set the hues near green (+/- 15)
iCount = (15 * (uLUTLen - 1))/255;
for (i=INCREMENT(uHueGreen,uLUTLen); iCount > 0; i = INCREMENT(i, uLUTLen), iCount--)
{
uHueTable[i] = ADD(uHueTable[i], uHueChange, uLUTLen);
uMaskTable[i] = 1;
}
iCount = (15 * (uLUTLen - 1))/255;
for (i=DECREMENT(uHueGreen, uLUTLen); iCount > 0; i =DECREMENT(i, uLUTLen), iCount--)
{
uHueTable[i] = ADD(uHueTable[i],uHueChange, uLUTLen);
uMaskTable[i] = 1;
}
nRet = L_RemapBitmapHue(pBitmap, uMaskTable, uHueTable, NULL, NULL, uLUTLen);
if(uMaskTable)
free(uMaskTable);
if(uHueTable)
free (uHueTable);
return nRet;
}