BufferedImage是Image的一个子类,BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等。

BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filePath));  

使图片变灰

    使图片变灰有两种方法,一种是使用现成的类,一种是自己对每个像素进行操纵。

使用现成的类ColorConvertOp,它的作用就是将一个颜色模式的图片转换为另一个颜色模式的图片。颜色模式是诸如RGB颜色模式、灰度颜色模式等决定图片色彩的东西,比如一副RGB颜色模式的图片是彩色,但我们把它复制到一个灰度颜色模式的图片上时,图片就成灰色的了。

public BufferedImage getGrayPicture(BufferedImage originalImage)
{
BufferedImage grayPicture;
int imageWidth = originalImage.getWidth();
int imageHeight = originalImage.getHeight(); grayPicture = new BufferedImage(imageWidth, imageHeight,
BufferedImage.TYPE_3BYTE_BGR);
ColorConvertOp cco = new ColorConvertOp(ColorSpace
.getInstance(ColorSpace.CS_GRAY), null);
cco.filter(originalImage, grayPicture);
return grayPicture;
}

     自己操纵图片的像素实现图片变灰。图片变灰的通用算法:取出某个像素的r、g、b值,然后重新计算r、g、b值,计算公式为r=r*0.3+g*0.59+b*0.11,g=r,b=g,最后将该rgb值重新写回像素。

可以用下面三个函数

分别取出r、g、b。ColorModel是一个用来将图片某点的rgb值转化为r、g、b以及alpha等值的类。而bufferedImage本身只能取出一个完整的rgb值,无法分离单独的r、g、b等值。

bufferedImage.getColorModel().getRed(int pixel)

bufferedImage.getColorModel().getGreen(int pixel)

bufferedImage.getColorModel().getBlue(int pixel)

但是这里要注意的是使用这种方法取出r、g、b时,有可能弹出一个错误信息——IllegalArgumentException: More than one component per pixel。通常当你使用这个方法操纵jpg等格式的图片时会报这个错误。这是因为某些图片如JPG格式的不支持使用单个int值的像素读取rgb等信息,应该使用Object类型的像素值进行读取,也就是bufferedImage.getColorModel().getGreen(Object indata)

public BufferedImage getGrayPicture(BufferedImage originalImage)
{
int green=0,red=0,blue=0,rgb;
int imageWidth = originalImage.getWidth();
int imageHeight = originalImage.getHeight();
for(int i = originalImage.getMinX();i < imageWidth ;i++)
{
for(int j = originalImage.getMinY();j < imageHeight ;j++)
{
//图片的像素点其实是个矩阵,这里利用两个for循环来对每个像素进行操作
Object data = routeImage.getRaster().getDataElements(i, j, null);//获取该点像素,并以object类型表示
red = routeImage.getColorModel().getRed(data);
blue = routeImage.getColorModel().getBlue(data);
green = routeImage.getColorModel().getGreen(data);
red = (red*3 + green*6 + blue*1)/10;
green = red;
blue = green;
/*
这里将r、g、b再转化为rgb值,因为bufferedImage没有提供设置单个颜色的方法,只能设置rgb。rgb最大为8388608,当大于这个值时,应减去255*255*255即16777216
*/
rgb = (red*256 + green)*256+blue;
if(rgb>8388608)
{
rgb = rgb - 16777216;
}
//将rgb值写回图片
routeImage.setRGB(i, j, rgb);
} } return originalImage;
}

BufferedImage操作图片笔记(转)的更多相关文章

  1. Java操作图片的工具类

    操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...

  2. ASP.NET MVC 网站开发总结(七)——C#操作图片:多张图的拼接(旋转)

    其实用C#来操作图片的拼接就是在用Graphic画图.个人感觉还是挺有趣的,各种类库提供了丰富多彩的功能. 源代码(移植到一个简单的C#程序中,并没有放在ASP.NET项目中): using Syst ...

  3. 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...

  4. 在Android下通过ExifInterface类操作图片的Exif信息

    什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...

  5. 利用numpy实现多维数组操作图片

    1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白 ...

  6. java使用Thumbnailator操作图片

    Thumbnailator 是一个用来生成图像缩略图.裁切.旋转.添加水印等操作的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图. Thumbnailato ...

  7. MySQL4.0命令操作学习笔记

    声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...

  8. 在c#中用指针操作图片像素点

    在Bitmap类中有两个函数SetPixel,GetPixel,分别用来设置或读取图片中指定点的颜色(这里发现了VS的一个错误,SetPixel的文档说明写的是“获取颜色”??). 当要对一幅图进行相 ...

  9. UWP开发入门(十五)——在FlipView中通过手势操作图片

    本篇的最终目的,是模拟系统的照片APP可以左右滑动,缩放图片的操作.在实现的过程中,我们会逐步分析UWP编写UI的一些思路和技巧. 首先我们先实现一个横向的可以浏览图片的功能,也是大部分APP中的实现 ...

随机推荐

  1. [原]F5负载均衡示例:轮寻

    /** * lihaibo 欢迎转载,请保留原地址 */ 规划: F5 1600 BIG-IP 内网 192.168.100.0 255.255.255.0 外网 10.50.20.0 255.255 ...

  2. 自定义vue全局组件use使用

    自定义一个全局Loading组件,并使用:总结目录:|-components |-loading |-index.js 导出组件,并且install |-loading.vue 定义Loading组件 ...

  3. mongodb的远程访问

    1,centos6上安装mongodb:2,新建可以远程访问的用户,以便可以远程访问: [root@localhost ~]# cd /usr/local/mongodb/bin/ [root@loc ...

  4. stopImmediatePropagation和stopPropagation (事件、防止侦听)

    参考: ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始 actionscript宝典 一.事件模型 egret中的事件模型和flash是一样的,但 ...

  5. JAVA unicode转换成中文

    /** * * unicode 转换成 中文 * @param theString * @return */ public static String decodeUnicode(String the ...

  6. 服务器群秒级别文件同步(ssh+SHELL)

    1.介绍 \ 2.业务服务器远程更新浏览服务器文件的脚本 #!/bin/bash operate=$ ip=$ conf_file="/var/www/html/test/ip_list&q ...

  7. 万事开头难 && 实践出真知

    实践出真知,真是千古不变的真理. 前几天在顺手做一个万年历项目,实现了用TFT屏显示实时时间,日期,温度,和按键设置时间,能在特定时间显示特定的话语在显示屏上面.其实这个项目现在想想还是挺简单的.我的 ...

  8. 8.21 js

    2018-8-21 20:05:43 2018-8-21 20:56:30 明天再看!!!! 今天空闲多看了书 <百年孤独> <苏东坡传> 打印结果  shanghai js的 ...

  9. hdu5692【dfs序】【线段树】

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  10. POJ 2653 - Pick-up sticks - [枚举+判断线段相交]

    题目链接:http://poj.org/problem?id=2653 Time Limit: 3000MS Memory Limit: 65536K Description Stan has n s ...