Java也可以非常简单的实现图片灰度化

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

本文通过一个简单的实例,演示如何使用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("渲染完成");
}
复制代码


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


image.png


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


此外介绍一个更好用的姿势,直接使用开源项目 github.com/liuyueyi/qu… 来实现灰度处理


使用这个项目的 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);
}
复制代码

注意这个ImgPixelWrapper封装类,处理基础的灰度处理之外,还支持生成字符图,图片像素化(如马赛克...)


至于quick-media这个项目就更有意思了,java侧若想生成酷炫的二维码,选择它绝对不会让你失望;有兴趣的小伙伴可以瞅一瞅




相关文章
|
2月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
85 4
|
2月前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
65 2
|
2月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
51 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
6月前
|
数据可视化 Java
Java语言使用DL4J实现图片分类
【6月更文挑战第14天】Java语言使用DL4J实现图片分类
115 3
|
2月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
126 1
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
22 1
|
2月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
88 1
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
128 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
3月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
3月前
|
存储 缓存 监控
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。