BufferedImage操作图片笔记
2011-02-24 12:29
357 查看
BufferedImage是Image的一个子类,BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等。
使图片变灰
使图片变灰有两种方法,一种是使用现成的类,一种是自己对每个像素进行操纵。
使用现成的类ColorConvertOp,它的作用就是将一个颜色模式的图片转换为另一个颜色模式的图片。颜色模式是诸如RGB颜色模式、灰度颜色模式等决定图片色彩的东西,比如一副RGB颜色模式的图片是彩色,但我们把它复制到一个灰度颜色模式的图片上时,图片就成灰色的了。
自己操纵图片的像素实现图片变灰。图片变灰的通用算法:取出某个像素的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)
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操作图片笔记
- BufferedImage操作图片笔记
- Swing中BufferedImage对象操作图片的相关内容
- 使用ImageMagick + Jmagick进行图片操作
- unity笔记-1128-UGUI替换Image图片的三种方式
- 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第四节 - 图片通用类BufferedImage
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
- python OpenCV学习笔记(六):图片的基本操作
- BufferedImage处理图片及创建图片
- Flex 学习笔记 flexlib控件之_Base64Image(图片Base64互换
- ZoomImageView实现手势操作图片的单击
- Qt模块化笔记之Qt_Quick——用QQuickImageProvider给Image组件添加图片
- 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第四节 - 图片通用类BufferedImage
- 《MonkeyRunner 原理剖析》第九章-MonkeyImage 实现原理 - 第七节 - 文件图片及子图处理类 BufferedImageChimpImage
- Android笔记之ImageView设置图片以灰色显示
- VS2010平台下ImageDib类读取图片的详细操作
- java 实现BufferedImage和ImageReader两种方式获取图片宽高、判断图片类型、获取图片大小工具类代码以及测试响应结果
- ImageIO操作图片
- 【Python_OpenCv】笔记4:python,OpenCv中对图片像素的操作以及图片基本属性的获取方法