Posts tagged gdi+

How to find the GdiObject type from handle.

0


Gdi Objects are represented by handles. Basically all handles are just an integer inside. For instance, if you’re writing a function with accepts HFONT as parameter, its quite possible to pass a typecasted handle of other Gdi object. So how can you determine the real Gdi object type from the handle?


You can use the function – GetObjectType(). See the following code snippet.

// Get the Black Brush.
HGDIOBJ hGdiObj = GetStockObject( BLACK_BRUSH );

// Check the object type with handle.
if( OBJ_BRUSH == GetObjectType( hGdiObj ))
{
    // Yes! The handle points to Gdi Brush.
}

So now add better error checking in your gdi routines. ;)


The values that GetObjectType() returns are,

  • OBJ_BITMAP – Bitmap
  • OBJ_BRUSH – Brush
  • OBJ_COLORSPACE – Color space
  • OBJ_DC Device – Context
  • OBJ_ENHMETADC – Enhanced metafile DC
  • OBJ_ENHMETAFILE – Enhanced metafile
  • OBJ_EXTPEN – Extended pen
  • OBJ_FONT – Font
  • OBJ_MEMDC – Memory DC
  • OBJ_METAFILE – Metafile
  • OBJ_METADC – Metafile DC
  • OBJ_PAL – Palette
  • OBJ_PEN – Pen
  • OBJ_REGION – Region


Targeted Audience – Beginners.

How to convert Image to Grayscale by using HLS colorspace?

0


Many image processing application provide functionality to convert images to gray scale. How they do it? There are many ways to convert an image to gray scale. The common method is to get the gray value of a pixel by the following equation

GrayValue = 0.3*Red + 0.59*Green + 0.11*Blue

There is another method to convert an image to grayscale – By using HLS colorspace. I’ve already explaned about HLS color space here -
http://weseetips.com/2008/05/22/convert-color-in-rgb-to-hls-and-vice-versa/

In the HLS color space, we can represent a pixel in Hue, luminosity and Saturation, where Saturation represents the colorfulness of the color or how colorful the color is. If the saturation goes to minimum, that color will become grayscale and if it goes to maximum the more fluorescent it will become.


1) Get each pixel in image in RGB.
2) Convert RGB to HLS and get the saturation.
3) Set saturation to 1 and convert back to RGB.
4) Set the new image pixel.

See the code snippet below. Please note that Its not an optimized one. Just to demonstrate the process.

// Create the image.
Bitmap ColorImage( csSourceImage );

// Get the size of image.
for( UINT x = 0; x < ColorImage.GetWidth(); ++x )
{
    for( UINT y = 0; y < ColorImage.GetHeight(); ++y )
    {
        // Get the pixel at x,y
        Color PixelColor;
        ColorImage.GetPixel( x, y, &PixelColor );

        // Convert it to COLORREF
        COLORREF RgbColor = PixelColor.ToCOLORREF();

        // Convert to HLS Color space
        WORD Hue = 0;
        WORD Luminance = 0;
        WORD Saturation = -100;
        ColorRGBToHLS( RgbColor, &Hue, &Luminance, &Saturation );

        // Set the saturation to 0 so that the
        // image will be greyscale.
        Saturation = 1;

        // Now re-generate HLS to RGB
        RgbColor = ColorHLSToRGB( Hue, Luminance, Saturation );

        // Convert back to Gdi+.
        PixelColor.SetFromCOLORREF( RgbColor );

        // Set it to image.
        ColorImage.SetPixel( x, y, PixelColor );
    }
}


Download sample project from here. The sample support only Jpeg images but can be easily extended.
http://jijoraj.110mb.com//samples/grayscaleconverter/GrayScaleConverter.zip
Please not that the GUI is not so much polished. ;)

As you think the first algorithm is more faster. But still HLS can be used and this is only one usage for HLS. The code snippet can be optimized further. But this is just for demo purpose. isn’t it? ;)


Targeted Audience – Intermediate.

Go to Top