多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
小时候我们都喜欢看连环画,虽然是黑白色的,但是也能让我们看的津津有味。 今天,我在这里介绍一种连环画特效的实现方法,带你回到那个记忆的年代。 那个时代彩色的书籍是很少的,连环画几乎都是黑白色的,而且有些发黄的年代感,这个也就是它的主要特点;还有一个特点就是,画面对比鲜明;针对这两点,我们可以实现了。 具体步骤如下: 1,假设图像像素P(i,j)的RGB值为r,g,b; 按照如下公式计算新的RGB: R = (|2*g-b+r|*r)>>8; G = (|2*b-g+r|*r)>>8; B = (|2*b-g+r|*r)>>8; 注意:这一步是达到对比度增强的效果。 2,计算灰度值: Gray = (R+G+B) / 3; 注意:这里直接使用了明度计算公式替代灰度化公式。 3,计算结果RGB: Red = Gray + 10; Green = Gray + 10; Blue = Gray; 注意:此处Red,Green需要约束到[0,255]。 具体C#代码如下: ~~~ private Bitmap FilterProcess(Bitmap a) { Bitmap srcBitmap = new Bitmap(a); int w = srcBitmap.Width; int h = srcBitmap.Height; System.Drawing.Imaging.BitmapData srcData = srcBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte* pSrc = (byte*)srcData.Scan0; int offset = srcData.Stride - w * 4; int red = 0, green = 0, blue = 0, gray = 0; for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { blue = (Math.Abs(pSrc[0] - pSrc[1] + pSrc[0] + pSrc[2]) * pSrc[1]) >> 8; green = (Math.Abs(pSrc[0] - pSrc[1] + pSrc[0] + pSrc[2]) * pSrc[2]) >> 8; red = (Math.Abs(pSrc[1] - pSrc[0] + pSrc[1] + pSrc[2]) * pSrc[2]) >> 8; blue = Math.Max(0, Math.Min(blue, 255)); green = Math.Max(0, Math.Min(green, 255)); red = Math.Max(0, Math.Min(red, 255)); gray = (blue + green + red) / 3; red = Math.Min(255, gray + 10); pSrc[0] = (byte)gray; pSrc[1] = (byte)red; pSrc[2] = (byte)red; pSrc += 4; } pSrc += offset; } srcBitmap.UnlockBits(srcData); return srcBitmap; } ~~~ 效果图如下: [![](https://box.kancloud.cn/2016-01-05_568b33210ebfe.jpg)](http://www.zealpixel.com/data/attachment/portal/201509/07/131816mw5qe59pq1uwcqae.jpg) 原图 [![](https://box.kancloud.cn/2016-01-05_568b33212af6c.png)](http://www.zealpixel.com/data/attachment/portal/201509/07/131816kfgeifek7w7f3ke3.png) 连环画效果图 最后,给出一个完整的DEMO源码下载连接:[http://www.zealpixel.com/forum.php?mod=viewthread&tid=135&extra=page%3D1](http://www.zealpixel.com/forum.php?mod=viewthread&tid=135&extra=page%3D1)