6.像素图片-图片灰度化

一灰灰blogQuickMediaimage-plugin约 508 字大约 2 分钟

本文通过一个简单的实例,演示如何使用java来实现图片灰度化处理,主要借助下面两种策略来处理颜色

灰度化公式

avgColor = red * 0.299f + green * 0.587f + blue * 0.114f

均值方式

avgColor = (red + green + blue) / 3.0f

基于上面两种方式,我们要实现一个图片灰度化的处理,无非就是获取图片的每个像素点的颜色,然后计算avgColor,再用新的颜色填充即可

一个基础的实现演示如下

private Color avg1(int red, int green, int blue) {
    int avg = Math.round((red * 0.299f + green * 0.587f + blue * 0.114f));
    return new Color(avg, avg, avg);
}
private Color avg2(int red, int green, int blue) {
    int avg = Math.round((red + green + blue) / 3);
    return new Color(avg, avg, avg);
}

@Test
public void testRender() throws IOException {
    String file = "http://i0.download.fd.52shubiao.com/t_960x600/g1/M00/10/17/oYYBAFWvR5-IeXHuAAd5kPb8eSgAACm0QF50xIAB3mo414.jpg";
    // 从网络上下载图片
    BufferedImage img = ImageIO.read(FileReadUtil.getStreamByFileName(file));


    int w = img.getWidth(), h = img.getHeight();
    // 创建新的灰度图片画板
    BufferedImage gray = new BufferedImage(w, h, img.getType());
    Graphics2D g2d = gray.createGraphics();
    g2d.setColor(null);
    g2d.fillRect(0, 0, w, h);

    for (int x = 0; x < w; x++) {
        for (int y = 0; y<h; y++) {
            // 针对像素点的颜色灰度化之后,重新绘制
            int color = img.getRGB(x, y);
            Color grayColor = avg1((color & 0xff0000) >> 16, (color & 0xff00) >> 8, color & 0x0000ff);
            g2d.setColor(grayColor);
            g2d.fillRect(x, y, 1, 1);
        }
    }
    g2d.dispose();
    System.out.printf("渲染完成");
}

生成原图与灰度图的对比如下

输出图
输出图

注意上面的实现,其中加载网络图片的具体实现,之前的博文有介绍,有兴趣的小伙伴可以参考: 封装一个根据路径获取文件资源的工具类

此外介绍一个更好用的姿势,直接使用开源项目 quick-media/image-pluginsopen in new window 来实现灰度处理

使用这个项目的 image-plugins 之后,生成一个灰度图就很简单了

@Test
public void testImgGrayAlg() {
    String img = "https://c-ssl.duitang.com/uploads/item/201809/16/20180916175034_Gr2hk.thumb.1000_0.jpeg";
    BufferedImage out = ImgPixelWrapper.build()
            .setSourceImg(img)
            .setPixelType(PixelStyleEnum.GRAY_ALG)
            .build()
            .asBufferedImg();
    System.out.println(out);
}
原图svg图
20180916175034_Gr2hk.jpegopen in new windowopen in new window
Loading...