通过看网上各种大牛的总结,和自己亲身测试总结一下Java图片的灰度处理方法

(1)我们熟知的图片中的像素点有RGB值。

(2)图片灰度化的方式大概分为四种,第一种是最大值法(取颜色RGB中的最大值作为灰度值);第二种是最小值法(取颜色RGB的最小值作为灰度值);第三种是均值法(取颜色的RGB的平均值作为灰度值);第四种是加权法灰度化(怎么加权最合适,效果最好,百度百科说的很全面)。

(3)废话不多说,记录一下我按照上述四种方法实现的效果和代码:

原图

按照上述四种方式分别灰度化后的效果如下面四图

(4)实例代码如下

  1. package testhuidu;
  2.  
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import java.io.IOException;
  6.  
  7. import javax.imageio.ImageIO;
  8.  
  9. public class TestHUidu {
  10. /**
  11. * 颜色分量转换为RGB值
  12. * @param alpha
  13. * @param red
  14. * @param green
  15. * @param blue
  16. * @return
  17. */
  18. private static int colorToRGB(int alpha, int red, int green, int blue) {
  19.  
  20. int newPixel = 0;
  21. newPixel += alpha;
  22. newPixel = newPixel << 8;
  23. newPixel += red;
  24. newPixel = newPixel << 8;
  25. newPixel += green;
  26. newPixel = newPixel << 8;
  27. newPixel += blue;
  28.  
  29. return newPixel;
  30.  
  31. }
  32.  
  33. public static void main(String[] args) throws IOException {
  34. grayImage(1,"ff.jpg", "1.jpg");//最大值法灰度化
  35. grayImage(2,"ff.jpg", "2.jpg");//最小值法灰度化
  36. grayImage(3,"ff.jpg", "3.jpg");//平均值法灰度化
  37. grayImage(4,"ff.jpg", "4.jpg");//加权法灰度化
  38. }
  39.  
  40. /**
  41. * 图片灰度化的方法
  42. * @param status 灰度化方法的种类,1表示最大值法,2表示最小值法,3表示均值法,4加权法
  43. * @param imagePath 需要灰度化的图片的位置
  44. * @param outPath 灰度化处理后生成的新的灰度图片的存放的位置
  45. * @throws IOException
  46. */
  47. public static void grayImage(int status,String imagePath, String outPath) throws IOException {
  48. File file = new File(imagePath);
  49. BufferedImage image = ImageIO.read(file);
  50.  
  51. int width = image.getWidth();
  52. int height = image.getHeight();
  53.  
  54. BufferedImage grayImage = new BufferedImage(width, height, image.getType());
  55. //BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
  56. for (int i = 0; i < width; i++) {
  57. for (int j = 0; j < height; j++) {
  58. int color = image.getRGB(i, j);
  59. final int r = (color >> 16) & 0xff;
  60. final int g = (color >> 8) & 0xff;
  61. final int b = color & 0xff;
  62. int gray=0;
  63. if(status==1){
  64. gray=getBigger(r, g, b);//最大值法灰度化
  65. }else if(status==2){
  66. gray=getSmall(r, g, b);//最小值法灰度化
  67. }else if(status==3){
  68. gray=getAvg(r, g, b);//均值法灰度化
  69. }else if(status==4){
  70. gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);//加权法灰度化
  71. }
  72. System.out.println("像素坐标:" + " x=" + i + " y=" + j + " 灰度值=" + gray);
  73. grayImage.setRGB(i, j, colorToRGB(0, gray, gray, gray));
  74. }
  75. }
  76. File newFile = new File(outPath);
  77. ImageIO.write(grayImage, "jpg", newFile);
  78. }
  79.  
  80. //比较三个数的大小
  81. public static int getBigger(int x,int y,int z){
  82. if(x>=y&&x>=z){
  83. return x;
  84. }else if(y>=x&&y>=z){
  85. return y;
  86. }else if(z>=x&&z>=y){
  87. return z;
  88. }else{
  89. return 0;
  90. }
  91. }
  92.  
  93. //比较三个是的大小取最小数
  94. public static int getSmall(int x,int y,int z){
  95. if(x<=y&&x<=z){
  96. return x;
  97. }else if(y>=x&&y>=z){
  98. return y;
  99. }else if(z>=x&&z>=y){
  100. return z;
  101. }else{
  102. return 0;
  103. }
  104. }
  105.  
  106. //均值法
  107. public static int getAvg(int x,int y,int z){
  108. int avg=(x+y+z)/3;
  109. return avg;
  110. }
  111. }

  

Java图片的灰度处理方法的更多相关文章

  1. [转载] IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

    IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

  2. java实现图像灰度化

    /*在研究Java实现将一张图片转成字符画的时候,发现将图像转化字符串是根据照片的灰度采用不同的字符画出来,形成一个灰度表.于是就研究了下关于灰度值这个东西,于是跳了一个大坑...因为鄙人用的ubun ...

  3. Java 图片转换为字符图 CharMaps (整理)

      /* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...

  4. simpleImageTool又纯java图片水印、缩放工具

    simpleImageTool又一个简单.好用的图片格式转换.缩放水印叠加等功能的纯Java图片工具库. simpleImageTool的由来,近期需要用到图片处理,通过网上的图片流直接进行缩放水印叠 ...

  5. Java 图片处理解决方案:ImageMagick 快速入门

    一.ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件,可以实现图片切割.颜色替换.图片缩略图.图片水印等各种效果.ImageMagick是免费开源软件,支持大多 ...

  6. Java 图片处理解决方案:ImageMagick 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...

  7. Android 中对于图片的内存优化方法

    Android 中对于图片的内存优化方法,需要的朋友可以参考一下     1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...

  8. [Xcode 实际操作]六、媒体与动画-(2)使用图形上下文转换图片为灰度图

    目录:[Swift]Xcode实际操作 本文将演示如何将图片转换为灰度图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  9. Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

    前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...

随机推荐

  1. 第八章、Designer组件属性编辑界面中QWidget类相关属性详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 声明:本文为老猿Python学习研究精心整理而成,禁止转载. 内容提纲 引言概述QWidget属性列 ...

  2. Python3安装且环境配置(三)

    1.在Window 平台安装 Python3 以下为在 Window 平台上安装 Python3 的简单步骤: 打开WEB浏览器访问http://www.python.org/download/ 在下 ...

  3. 支持“EFDBContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

    在修改数据库表后会出现 支持"EFDBContext"上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库 这个问题解决方法: 在Global.a ...

  4. Day6【Scrum 冲刺博客】

    每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 对接住户相关接口 处理token过期重定向.页面跳转.错误状态处理等内容 方子茵(Laa-L) 暂无 黄芯悦(Sheaxx) 完善物业报修页 ...

  5. Day2 【Scrum 冲刺博客】

    每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 新增人员管理页面的开发 静态页面的进一步完善 方子茵(Laa-L) 完成车辆查询接口 黄芯悦(Sheaxx) 新增社区通知页面 新增社区活动 ...

  6. 对网页接口的追踪探索(以b站通过bv号查询av号为例

    对网页接口的追踪探索(以b站通过bv号查询av号为例 序言 本文只提供一种探索网页加载时后端访问接口情况的思路,所举例子没有太大实际用处. 一 自2020年3月23日起,AV号将全面升级到BV号.但是 ...

  7. 【CSP-S 2019】树的重心(重心的性质)

    Description 给定一颗 \(n\) 个顶点的树 \(\text T\),共 \(n-1\) 次断边操作,每次将树分为两部分 \(\text T_1, \text T_2\),求: \[\su ...

  8. Trie 练习记录

    蒟蒻以前写的逊爆讲解 Trie CF665E Beautiful Subarrays 代码 把之前每个前缀和放进 trie 树里,然后 trie 树上查询即可. CF37C Old Berland L ...

  9. 笔记-Recursive Queries

    Recursive Queries \[m_{l,r}=\textrm{id}(\max_{i=l}^r a_i)\\ f(l,r)= \begin{cases} (r-l+1)+f(l,m_{l,r ...

  10. Chrome DevTools — Network -- 转载

    转载地址:https://segmentfault.com/a/1190000008407729 记录网络请求 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,当然, ...