本文通过一个简单的实例,演示如何使用java来实现图片灰度化处理,主要借助下面两种策略来处理颜色
灰度化公式
avgColor=red*0.299f+green*0.587f+blue*0.114f
均值方式
avgColor=(red+green+blue)/3.0f
基于上面两种方式,我们要实现一个图片灰度化的处理,无非就是获取图片的每个像素点的颜色,然后计算avgColor,再用新的颜色填充即可
一个基础的实现演示如下
privateColoravg1(intred,intgreen,intblue){intavg=Math.round((red*0.299f+green*0.587f+blue*0.114f));returnnewColor(avg,avg,avg);}privateColoravg2(intred,intgreen,intblue){intavg=Math.round((red+green+blue)/3);returnnewColor(avg,avg,avg);}@TestpublicvoidtestRender()throwsIOException{Stringfile="http://i0.download.fd.52shubiao.com/t_960x600/g1/M00/10/17/oYYBAFWvR5-IeXHuAAd5kPb8eSgAACm0QF50xIAB3mo414.jpg";//从网络上下载图片BufferedImageimg=ImageIO.read(FileReadUtil.getStreamByFileName(file));intw=img.getWidth(),h=img.getHeight();//创建新的灰度图片画板BufferedImagegray=newBufferedImage(w,h,img.getType());Graphics2Dg2d=gray.createGraphics();g2d.setColor(null);g2d.fillRect(0,0,w,h);for(intx=0;x<w;x++){for(inty=0;y<h;y++){//针对像素点的颜色灰度化之后,重新绘制intcolor=img.getRGB(x,y);ColorgrayColor=avg1((color&0xff0000)>>16,(color&0xff00)>>8,color&0x0000ff);g2d.setColor(grayColor);g2d.fillRect(x,y,1,1);}}g2d.dispose();System.out.printf("渲染完成");}
生成原图与灰度图的对比如下
注意上面的实现,其中加载网络图片的具体实现,之前的博文有介绍,有兴趣的小伙伴可以参考: 封装一个根据路径获取文件资源的工具类
此外介绍一个更好用的姿势,直接使用开源项目 https://github.com/liuyueyi/quick-media 来实现灰度处理
使用这个项目的 image-plugins
之后,生成一个灰度图就很简单了
@TestpublicvoidtestImgGrayAlg(){Stringimg="https://c-ssl.duitang.com/uploads/item/201809/16/20180916175034_Gr2hk.thumb.1000_0.jpeg";BufferedImageout=ImgPixelWrapper.build().setSourceImg(img).setPixelType(PixelStyleEnum.GRAY_ALG).build().asBufferedImg();System.out.println(out);}
注意这个ImgPixelWrapper
封装类,处理基础的灰度处理之外,还支持生成字符图,图片像素化(如马赛克...)
至于quick-media这个项目就更有意思了,java侧若想生成酷炫的二维码,选择它绝对不会让你失望;有兴趣的小伙伴可以瞅一瞅
公众号:一灰灰blog