大家都知道微信公众号可以从微信官方服务器获取对应的二维码(包括临时二维码及永久二维码),这样的需求常用于商业客户层次关系管理场景,但是如果有很多客户,就算二维码中的SCENCE_ID不同,就凭肉眼不容易看出来,那么我常用的做法就是在二维码中间添加一个LOGO,一般是当前客户自己的微信图片。
我们根据TOKEN从https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN获取到二维码后,参数如下两个博文来进行合成:
http://blog.youkuaiyun.com/u013142781/article/details/50310419
https://www.cnblogs.com/lmei/p/4626042.html
最后发现,生成的图片竟然无论怎么搞都是黑白的。
通过仔细观察,从微信取下来的二维码图片是grayscale,也就是颜色空间是灰阶的,那么我们用通用的方式以这个二维码为底图向上面叠加LOGO的时候,得到的还是灰阶图片,以致引起这个问题。问题找到了,那么解决方式就好说了。参考:
http://blog.youkuaiyun.com/10km/article/details/51866321
这篇文章
java.awt.image包下面有个类java.awt.image.ColorConvertOp,类名直译就是”颜色转换操作”。
顾名思义,它的作用就是将一个色彩空间(color space)的图像转换为另一个色彩空间的图像。有了这个神器我们就能轻易的将一张彩色图你像转换成灰度(gray)或其他色彩空间图像。代码非常简单,只要一行。
public static BufferedImage toGray(BufferedImage srcImg){
return new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB), null).filter(srcImg, null);
}
这样我们就将原来的二维码图片变换了颜色空间,再利用上述两篇博文提到的方式合成图片即可。
更多文章参考:
Image转BufferedImage并提取像素进行颜色空间转换:
http://blog.youkuaiyun.com/qq_29859497/article/details/72860023
Java加载图片 Image与BufferedImage 区别:
http://blog.youkuaiyun.com/landlord921/article/details/38736619