java bufferimage类_java BufferImage类的使用

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

BufferedImage bufferedImage = ImageIO.read(newFileInputStream(filePath));

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

使图片变灰

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

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

publicBufferedImage getGrayPicture(BufferedImage originalImage)

{

BufferedImage grayPicture;

intimageWidth = originalImage.getWidth();

intimageHeight = originalImage.getHeight();

grayPicture =newBufferedImage(imageWidth, imageHeight,

BufferedImage.TYPE_3BYTE_BGR);

ColorConvertOp cco =newColorConvertOp(ColorSpace

.getInstance(ColorSpace.CS_GRAY),null);

cco.filter(originalImage, grayPicture);

returngrayPicture;

}

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)

publicBufferedImage getGrayPicture(BufferedImage originalImage)

{

intgreen=0,red=0,blue=0,rgb;

intimageWidth = originalImage.getWidth();

intimageHeight = originalImage.getHeight();

for(inti = originalImage.getMinX();i 

{

for(intj = originalImage.getMinY();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);

}

}

returnoriginalImage;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值