判断图片-判断位图是否是黑白图片的方法
图片象对:经过理处过的jpg格式的位图(头像照片)
算法道理:
通过个每像素点的rgb值来行进判断。我们道知,位图都是由像素点形成的,个每像素点都有一个 rbg值,所以可以通过rgb值来判断图片否是是彩色的。
【rgb】:r代表红,g代表绿,b代表蓝,通过三原色道理来形成丰富多彩的色颜。
开端思绪:
1、纯彩色图片,只有判断像素点的色颜是黑还是白就能够了,一旦碰到非彩色色颜,就能够以为长短彩色图片。
2、灰阶彩色图片,由于有灰阶,所以不是能通过像素点否是是彩色来判断,但是灰阶像素点的rgb有个特色:【r=g=b】
算法优化:
1、纯彩色,只有白黑二色,白色rgb【r=g=b=255】,色黑【r=g=b=0】;
2、灰阶,rgb【r=g=b】;
可以看出无论是彩色还是灰阶都是rgb中【r=g=b】
碰到问题:
有些可以以为是彩色图片,存在偏绿或者偏红的况情,用【r=g=b】法无判断出来。
理处思绪:
虽然这些图片【r<>b<>g】但是色颜大体一致都是近靠灰阶色颜,所以r,g,b的差值该应不是很大,经过我自己测试,发明种这【有偏色的彩色照片】图片中的有所像素点的r,g,b差值绝对最大值不超越50(r-g,r-b,g-b),而彩色图片中的r,b,g差值存在绝对值最大值存在超越 50的像素点。
单简说来就是:
1、【自定义】色偏值 diff = max(|r-g|,|r-b|,|g-b|);
2、彩色图片有所图片中最大的 diff < 50;
【p.s:这个算法可能存在误差,格严意义上说来r=g=b,diff=0才对。】
详细现实:
/// <summary>
/// 判断图片否是是彩色
/// </summary>
/// <param name="filename">图片文件路径</param>
/// <returns></returns>
public bool isblackwhite(string filename)
{
color c = new color();
using (bitmap bmp = new bitmap(filename))
{
//历遍图片的像素点
for (int y = 0; y < bmp.height; y++)
{
for (int x = 0; x < bmp.width; x++)
{
c = bmp.getpixel(x, y);
//判断像素点的色偏差值diff
if (getrgbdiff(c.r, c.g, c.b) > 50)
{
return false;
}
}
}
return true;
}
}
public int getrgbdiff(int r,int g,int b)
{
//略,很单简的,就是取r-g,r-b,g-b绝对值的最大值。
}