Цветовой процент в растровом изображении
Начал, не зная о растровом изображении**
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
Остальные из них будут смешанными цветами, которые должны подарить мне. Очевидно, что программа будет работать тысячи раз, поэтому мне нужно использовать Lockbits.
текущая проблема - неточный результат. Просьба предложить. Попытка использовать библиотеки aforge.net или imagemagick.net, чтобы проверить, может ли он дать точные результаты
Как найти процент цветных пикселей в растровом изображении, изначально объект растрового изображения взят со страницы PDF. Я пытался с bitmap.getpixel (), это занимает много времени, LockBits лучше в производительности, хотел бы знать, используя Lockbits, чтобы найти процент цветных пикселей, исключая черный, белый и серый. Это делается для определения цветных страниц в PDF-файле и использования цвета для печати конкретной страницы.
Я только что получил код для определения количества черных и белых пикселей, я просто пытаюсь использовать этот код для определения процента, просто найдя общее количество пикселей, и тогда разница должна дать мне цветные пиксели, но я не уверен, что это правильно подходить или нет !!
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);