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

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

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

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

原图

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

(4)实例代码如下

package testhuidu;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; import javax.imageio.ImageIO; public class TestHUidu {
/**
* 颜色分量转换为RGB值
* @param alpha
* @param red
* @param green
* @param blue
* @return
*/
private static int colorToRGB(int alpha, int red, int green, int blue) { int newPixel = 0;
newPixel += alpha;
newPixel = newPixel << 8;
newPixel += red;
newPixel = newPixel << 8;
newPixel += green;
newPixel = newPixel << 8;
newPixel += blue; return newPixel; } public static void main(String[] args) throws IOException {
grayImage(1,"ff.jpg", "1.jpg");//最大值法灰度化
grayImage(2,"ff.jpg", "2.jpg");//最小值法灰度化
grayImage(3,"ff.jpg", "3.jpg");//平均值法灰度化
grayImage(4,"ff.jpg", "4.jpg");//加权法灰度化
} /**
* 图片灰度化的方法
* @param status 灰度化方法的种类,1表示最大值法,2表示最小值法,3表示均值法,4加权法
* @param imagePath 需要灰度化的图片的位置
* @param outPath 灰度化处理后生成的新的灰度图片的存放的位置
* @throws IOException
*/
public static void grayImage(int status,String imagePath, String outPath) throws IOException {
File file = new File(imagePath);
BufferedImage image = ImageIO.read(file); int width = image.getWidth();
int height = image.getHeight(); BufferedImage grayImage = new BufferedImage(width, height, image.getType());
//BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int color = image.getRGB(i, j);
final int r = (color >> 16) & 0xff;
final int g = (color >> 8) & 0xff;
final int b = color & 0xff;
int gray=0;
if(status==1){
gray=getBigger(r, g, b);//最大值法灰度化
}else if(status==2){
gray=getSmall(r, g, b);//最小值法灰度化
}else if(status==3){
gray=getAvg(r, g, b);//均值法灰度化
}else if(status==4){
gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);//加权法灰度化
}
System.out.println("像素坐标:" + " x=" + i + " y=" + j + " 灰度值=" + gray);
grayImage.setRGB(i, j, colorToRGB(0, gray, gray, gray));
}
}
File newFile = new File(outPath);
ImageIO.write(grayImage, "jpg", newFile);
} //比较三个数的大小
public static int getBigger(int x,int y,int z){
if(x>=y&&x>=z){
return x;
}else if(y>=x&&y>=z){
return y;
}else if(z>=x&&z>=y){
return z;
}else{
return 0;
}
} //比较三个是的大小取最小数
public static int getSmall(int x,int y,int z){
if(x<=y&&x<=z){
return x;
}else if(y>=x&&y>=z){
return y;
}else if(z>=x&&z>=y){
return z;
}else{
return 0;
}
} //均值法
public static int getAvg(int x,int y,int z){
int avg=(x+y+z)/3;
return avg;
}
}

  

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. PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQ ...

  2. 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  3. PyQt(Python+Qt)学习随笔:工具箱(QToolBox)编程使用的步骤及示例代码

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 使用toolBox开发应用时,通过Designer设计ui界面时,只能在Designer中设计too ...

  4. 分布式计算框架-Spark(spark环境搭建、生态环境、运行架构)

    Spark涉及的几个概念:RDD:Resilient Distributed Dataset(弹性分布数据集).DAG:Direct Acyclic Graph(有向无环图).SparkContext ...

  5. 【复习笔记】重习 AC 自动机

    发现已经忘了许多....于是复习一下 基础要点概况 AC 自动机基于 Trie 树 的结构,即构建 AC 自动机前需要先建 Trie. 一个状态中除了转移 \(\delta\) 之外还有失配指针 \( ...

  6. P6100 [USACO19FEB]Painting the Barn G

    本题解提供的做法思路应该是比较清晰的,可惜代码实现比较繁琐,仅供大家参考. 题解 不难发现 \(x\) ,\(y\) 的取值范围只有 \(200\) ,所以我们可以考虑从这里入手.我们可以先通过二维前 ...

  7. springboot配置ssl证书

    springboot默认使用的是tomcat: 1.先到阿里云上注册一个证书,绑定域名:后面可以在管理中下载证书,下载tomcat对应的证书(一个*.pfx文件和*.txt文件) 2.将pfx文件拷贝 ...

  8. Salesforce LWC学习(二十八) 复制内容到系统剪贴板(clipboard)

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipb ...

  9. Ajax相关基础知识总结

    URL:统一资源定位符 网络的七层协议:网卡 驱动  网络层(ip)  传输层(tcp udp) 会话层( )  应用层(http.) restful表征状态转移(一种表征架构) CURD 增删改查 ...

  10. 使用vika维格表来管理寺庙原来如此轻松~

    我有一款适合用于寺庙管理的软件推荐,它是vika维格表,一款一站式的项目管理工具. 一站式项目管理 一个小小的寺庙需要管理的内容也非常的多,你应该不会购买多个系统去管理不同的项目,这样会让寺庙的花费大 ...