原图(第一张) 第二张:第一次执行 第三张:继续一次执行 第四张:继续一次执行
private void 光照效果函数()
{ //图像高光部分会被照亮,形成高光效果。
//由于是等比例分配,几乎不会改变色相值,缺点是色比例为0时不调。全彩时色比例是0
//'较暗的地方也会亮起来,背景杂点色彩(一般指比字体淡的)通过一次遍历也可以直接消除。
//作者:郑斯彬
bitmapOp = objImage.getPeekImage();
if (bitmapOp == null) { MessageBox.Show("请打开要操作的图片!", "错误"); return; }
SetBitmap BMPClass = new SetBitmap(bitmapOp);
BMPClass.LockBits();
int bmpWidth = bitmapOp.Width, bmpHeight = bitmapOp.Height;
rgbClass rgb = new rgbClass();
//二维图像数组循环
for (int i = 0; i < bmpWidth; i++)
for (int j = 0; j < bmpHeight; j++)
{
//读取当前像素的RGB颜色值
curColor = BMPClass.GetPixel(i, j); //使用类数组方式查询结果,直接指针内存操作。减少系统.GetPixel的使用频率
rgb.SetRGB(curColor); rgb.GetBigMY(18); //做个简单的排序
if (rgb.D > 0)
{
double add = (255 - rgb.SN + 128 * rgb.SB) / 6.0; //强调SN浓度低的地方,除以6是不想调整幅度太大
double BBH = (add * rgb.XLD) / 255.0; //计算黑白色的程度, double BBH = (add * rgb.X) / 255.0;
int 小 = (int)(rgb.X + BBH); //计算最小值
int 中 = (int)(rgb.Z + BBH + BBH * rgb.ZH / rgb.D);
int 大 = (int)(rgb.D + BBH + (BBH * rgb.SN) / rgb.D);
BMPClass.FixRGB(ref 小, ref 中, ref 大);
rgb.X = (byte)小;
rgb.Z = (byte)中;
rgb.D = (byte)大;
BMPClass.SetPixel(i, j, rgb.Color); // Color.FromArgb(rgb.red, rgb.green, rgb.blue)
}
} //for
//从内存解锁Bitmap
BMPClass.UnlockBits();