BufferedImage操作图片笔记(转)
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操作图片笔记(转)的更多相关文章
- Java操作图片的工具类
操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...
- ASP.NET MVC 网站开发总结(七)——C#操作图片:多张图的拼接(旋转)
其实用C#来操作图片的拼接就是在用Graphic画图.个人感觉还是挺有趣的,各种类库提供了丰富多彩的功能. 源代码(移植到一个简单的C#程序中,并没有放在ASP.NET项目中): using Syst ...
- 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片
原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...
- 在Android下通过ExifInterface类操作图片的Exif信息
什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...
- 利用numpy实现多维数组操作图片
1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白 ...
- java使用Thumbnailator操作图片
Thumbnailator 是一个用来生成图像缩略图.裁切.旋转.添加水印等操作的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图. Thumbnailato ...
- MySQL4.0命令操作学习笔记
声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...
- 在c#中用指针操作图片像素点
在Bitmap类中有两个函数SetPixel,GetPixel,分别用来设置或读取图片中指定点的颜色(这里发现了VS的一个错误,SetPixel的文档说明写的是“获取颜色”??). 当要对一幅图进行相 ...
- UWP开发入门(十五)——在FlipView中通过手势操作图片
本篇的最终目的,是模拟系统的照片APP可以左右滑动,缩放图片的操作.在实现的过程中,我们会逐步分析UWP编写UI的一些思路和技巧. 首先我们先实现一个横向的可以浏览图片的功能,也是大部分APP中的实现 ...
随机推荐
- jenkins部署war包到远程服务器的tomcat
一.目的 jenkins上将war包,部署到远程服务器的tomcat上. 这边tomcat在windows 主机A上,版本apache-tomcat-8.5.23. jenkins在主机B上,cent ...
- [转]了解如何通过reverse_iterator的base得到iterator
转自:http://blog.csdn.net/shuchao/article/details/3705252 调用reverse_iterator的base成员函数可以产生“对应的”iterator ...
- 初学lua --lua嵌入c++的一个问题(初始化lua出错,版本问题)
初学lua.从http://lua-users.org/wiki/CallingLuaFromCpp上下载了一个lua嵌入C++的代码.编译并运行.发现有错误: PANIC: unprotected ...
- 【CF889E】Mod Mod Mod DP
[CF889E]Mod Mod Mod 题意:给你一个序列$a_1,a_2...a_n$,定义$f(x,n)=x\mod a_n$,$f(x,i)=x\mod a_i+f(x \mod a_i,i+1 ...
- Spring Boot 商城项目
Spring Boot 商城项目 angularJS Demo1 <html> <head> <title>angularJS Demo1</title> ...
- Springmvc配置文件application.xml 和 spring-servlet.xml
文章来源:http://blog.csdn.net/tengdazhang770960436/article/details/48395885 1.SpringMVC 的配置分为两部分 applica ...
- html如何引用另一个html的内容
第一种:使用jquery: https://api.jquery.com/load/ 这可以加载html中某个id的元素 $( "#result" ).load( "aj ...
- Xcode - Your development team, "", does not support the Push Notifications capability.
1.问题描述: 从git上checkout了别人的一个工程文件,选择team时,Xcode显示如下问题 Your development team, "xxx.xxx.xxx", ...
- yii---判断POST请求
我们在进行数据的提交的时候,很多时候会判断请求状态来进行不同的选择.常见的就是判断POST以及GET的请求方式,下面是YII判断POST请求的代码示例: public function actionP ...
- ZooKeeper (一)概览
注:出于记录对 zookeeper 的学习研究成果目的,并分享经验,根据官方文档翻译整理而成本文,原文地址: http://zookeeper.apache.org/doc/trunk/zookeep ...