Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
693 views
in Technique[技术] by (71.8m points)

c# - Colour percentage in Bitmap

Started without knowing about bitmap**

To get total pixels in bitmap  height*Width 
To get total white pixels Where R==255 & B==255 & G==255
To get total black pixels Where R==0 & B==0 & G==0
To get total grey pixels where R=G=B

Rest of them will be a mixed colours which should give me. Obviously the program will run for thousands of times,so I need to use Lockbits.

current problem is inaccurate result. pls suggest. Trying to use aforge.net or imagemagick.net libraries to check whether it can give accurate results


How do I find the color pixels percentage in bitmap, originally the bitmap object is from PDF page. I tried with bitmap.getpixel() it is taking ages, LockBits is better in performance, Would like to know using Lockbits finding the percentage of color pixels excluding black, white and grey. This is to identify the colour pages in PDF file and colour usage for printing specific page.

I have just got a code to detect the count of black and white pixels, I am just trying to make use of this code to detect percentage just by finding the total pixels and then the difference should give me colour pixels,not sure it is correct approach or not!!

 public void ColourPercentage(Bitmap page, ref int nBlackCount, ref int nWhiteCount)
    {
        System.Drawing.Image image = null;
        Bitmap bmpCrop = null;

        BitmapData bmpData = null;
        byte[] imgData = null;
        int n = 0;
        try
        {
            image = page;
            bmpCrop = new Bitmap(image);
            for (int h = 0; h < bmpCrop.Height; h++)
            {

                bmpData = bmpCrop.LockBits(new System.Drawing.Rectangle(0, h, bmpCrop.Width, 1),
                System.Drawing.Imaging.ImageLockMode.ReadOnly, image.PixelFormat);
                imgData = new byte[bmpData.Stride];
                System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, imgData, 0
                , imgData.Length);
                bmpCrop.UnlockBits(bmpData);

                for (n = 0; n <= imgData.Length - 3; n += 3)
                {
                    if ((int)imgData[n] == 000 && (int)imgData[n + 1] == 0 && (int)imgData[n + 2] == 000)// R=0 G=0 B=0 represents Black
                    {
                        nBlackCount++;
                    }
                    else if ((int)imgData[n] == 255 && (int)imgData[n + 1] == 255 && (int)imgData[n + 2] == 255) //R=255 G=255 B=255 represents White
                    {
                        nWhiteCount++;
                    }
                    else if ((int)imgData[n] == (int)imgData[n + 1] && (int)imgData[n + 1] == (int)imgData[n + 2])
                        nBlackCount++;
                }

            }

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message);
        }     
    }

  public void blackwhiteCount(Bitmap page, ref int nBlackCount, ref int nWhiteCount)
    {
        System.Drawing.Color pixel;
        try
        {
            for (int i = 0; i < page.Height; i++)
            {
                for (int j = 0; j < page.Width; j++)
                {
                    pixel = page.GetPixel(i, j);
                    if (pixel.R == 0 && pixel.G == 0 && pixel.B == 0)
                        nBlackCount++;
                    else if (pixel.R == 255 && pixel.G == 255 && pixel.B == 255)
                        nWhiteCount++;
                }
            }
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show("Unable to parse image " + ex);
        }
    }

ColourPercentage(page, ref nblack, ref nwhite);
                             double nTotal = page.Width * page.Height;
                            string blackper, whiteper, colourper;
                            double black =(double) nblack*100 / nTotal;
                            double white =(double) nwhite *100 / nTotal;
                            double colour = 100 - (black + white);
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I have found myself, for viewers convenience for re usage, adding the correction(Question is updated with the answer already).

To get total pixels use image dimensions, instead of counting the looping pixels in bitlockdata.

Image page= new Image(filePath);
double nTotal = page.Width * page.Height;

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...