Click here to Skip to main content
15,881,809 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Dear friends,,


I have an image in a picture box, and I want to get Pixels(or all the area that contains) of all shades of blue color in that picture or image. For Example: I have a picture box with an image and two buttons, one for blue and on for green, I want when I click on blue then only blue shades in that picture should be visible and the rest is not visible. Same for the green button.


Please friends help me.

Thanks in advance!
Posted
Updated 21-May-12 4:31am
v4

I'm not sure if you mean the same thing as I when talking of a shade of a color: See here please[^].
Could it be that you really want to calculate the hue part of HSV[^] and all colors that fall into a certain hue range are considered to be in a class?

Regards,

Manfred
 
Share this answer
 
Comments
MuhtarQong 21-May-12 10:44am    
I assume that he is going to split an RGB image to Blue, Green and Red components (layer or band). Then ,display only a specific layer (for example Blue layer only) each time a button (corresponding buttuns to colors) is clicked.
Hopefully, I will provide a solution for your question during the lunch-break.
BobJanova 21-May-12 11:02am    
The use of 'blue' and 'green' leads me to believe he's talking about channels as well, but it could also be a hue filter.
rahulbhadouria 21-May-12 13:27pm    
friends I have a Image with multiple colors but I want all shades of particular color...i may be green or red or blue.
rahulbhadouria 21-May-12 13:35pm    
Dear Manfred,,

You are guessing right,,I want exactly what you are talking..
I have made function and enum. For convinience I have created an enum for layer selection, "WhichLayer"
C#
public enum WhichLayer
    {
        Red=0,
        Green=1,
        Blue=2
    }


Then, the functions as follows:
C#
private Bitmap GetSpecificLayer(Bitmap image, WhichLayer layer)
{
    Rectangle rect=new Rectangle(0, 0, image.Width, image.Height);
    BitmapData dataIn = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

    Bitmap result = new Bitmap(rect.Width,rect.Height,PixelFormat.Format8bppIndexed);
    // Keep the original resolotion
    result.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    // Set Grayscale palette
    SetGrayscalePalette(result);
    BitmapData dataOut = result.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

    int strideIn = dataIn.Stride;
    int strideOut = dataOut.Stride;
    int lineOffsetIn = dataIn.Stride - rect.Width * 3;
    int lineOffsetOut = dataOut.Stride - rect.Width;

    // Get layer index
    int ind=0;
    switch(layer)
    {
        case WhichLayer.Blue: ind=0; break;
        case WhichLayer.Green:ind=1; break;
        case WhichLayer.Red: ind = 2;break;
    }
    unsafe
    {
        byte* pIn = (byte*)(void*)dataIn.Scan0;
        byte* pOut = (byte*)(void*)dataOut.Scan0;

        for (int y = 0; y < image.Height; y++)
        {
            for (int x = 0; x < image.Width; x++)
            {
                pOut[0] = pIn[ind];
                pIn += 3;       // skip RGB24=3; RGB32=4...
                pOut++;
            }
            pIn += lineOffsetIn;
            pOut += lineOffsetOut;
        }
    }
    image.UnlockBits(dataIn);
    result.UnlockBits(dataOut);

    return result;
}


private static void SetGrayscalePalette(Bitmap b)
{
    ColorPalette pal = b.Palette;
    for (int i = 0; i < 256; i++)
        pal.Entries[i] = Color.FromArgb(255, i, i, i);
    b.Palette = pal;
}


The above is only for RGB images (24-bit). If you need for all RGB color images you may do separately for each format. Or you may use third party tools. You may find one here:http://www.artuxsoft.com[^]
 
Share this answer
 
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900