吃晚饭的时候, 朋友发了一组图片过来, 让我抠个图; 对, 没听错, 知道我是程序猿, 所以让我抠个图;
抠图这个说法, UI设计师们都接受不了; 身为程序猿当然要更高雅一些, 能敲代码的就绝不抠图;
好了, 进入正题; 其实分析一下, 需求也比较简单, 就是把图片中的白色或者接近白色的背景换为透明, 黑色签名露出来; 下面是图片处理前:
首先说一下返回原始图片文字, 代码如下:
参数bytesPerRow代表被渲染内存区域中每行所占字节, 其中4代表每个像素点RGBA所占的字节, 之后乘以imageHeight
得到所占内存空间;colorspace
用于被渲染内存区域的颜色;最关键的代码就是将RGB值为白色或趋近与白色的透明度设为0;我这里取了140是因为这张图片背景有点灰, 大家可以自行设置;
效果如下:
看得出文字有点模糊, 这是因为处理过程是对每一个像素直接设置为透明, 图片并不是只有黑白两个颜色, 所以文字周边的区域就会变暗了, 再加上原图给的也不是很清晰, 那应该怎么处理呢?
这里涉及到灰度图, 代码如下:
效果图:
说到灰度图, 就不得不提一个很著名的彩色转灰度的心理学公式:Gray = R*0.299 + G*0.587 + B*0.114
算法处理如下:
a. 首先将彩色图像转换为灰度图像
b. 计算灰度图像的算术平均值M
c. 以M为阈值,完成对灰度图二值化( 大于阈值M,像素点赋值为白色,否则赋值为黑
色)
上面的代码还看不出来, 应该是方法内部做了处理, 咱们来看👇下面的:
附:
维基灰度算法
处理成灰度图后基本只剩下黑白两种颜色; 为了寻求最优解, 我们再把屏幕中白色变透明, 黑色加深, 就得到所谓的高保真效果了;
代码如下:
最终效果图:
最后附上github地址;
demo下载