最近在写一个基于深度学习的网站是,需要根据返回来的坐标来截取图片。
先简单的实现一下这个功能,后续在不断的进行完善的包装。
虽然没用python方便,但也非常简单了。
一.需要依赖的类
BufferedImage
BufferedImage 这个类里面已经提供了一个getSubimage方法,只要提供起点坐标以及宽高就好了。
二.全面了解一下这个类
BufferedImage对象中最重要的两个组件是Raster与ColorModel,分别用于存储图像的像素数据和颜色数据。
Raster对象的作用与像素存储
BufferedImage支持从Raster对象中获取任意位置(x,y)点的像素值p(x,y)
image.getRaster().getDataElements(x,y,width,height,pixels)
x,y表示开始的像素点,width和height表示像素数据的宽度和高度,pixels数组用来存放获取到的像素数据,image是一个BufferedImage的实例化引用
图像类型与ColorModel
其实现类为IndexColorModel,IndexColorModel的构造函数有五个参数:分别为
Bits:表示每个像素所占的位数,对RGB来说是8位
Size:表示颜色组件数组长度,对应RGB取值范围为0~255,值为256
r[]:字节数组r表示颜色组件的RED值数组
g[]:字节数组g表示颜色组件的GREEN值数组
b[]:字节数组b表示颜色组件的BLUE值数组
BufferedImage对象的创建与保存
(1)创建一个全新的BufferedImage对象,直接调用BufferedImage的构造函数
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY)
其中width表示图像的宽度,height表示图像的高度,最后一个参数表示图像字节灰度图像
(2)根据已经存在的BufferedImage对象来创建一个相同的copy体
public BufferedImage createBufferedImage(BufferedImage src){
ColorModel cm = src.getColorModel();
BufferedImage image = new BufferedImage(cm,
cm.creatCompatibleWritableRaster(
src.getWidth(),
src.getHeight()),
cm.isAlphaPremultiplied(), null);
return image;
}
(3)通过创建ColorModel 和Raster对象实现BufferedImage 对象的实例化
public BufferedImage createBufferedImage(int width , int height, byte[] pixels){
ColorModel cm = getColorModel();
SampleModel sm = getIndexSampleModel((IndexColorModel)cm, width,height);
DataBuffer db = new DataBufferByte(pixels, width*height,0);
WritableRaster raster = Raster.creatWritableRaster(sm, db,null);
BufferedImage image = new BufferedImage (cm, raster,false, null);
return image;
}
读取一个图像文件
public BufferedImage readImageFile(File file)
{
try{
BufferedImage image = ImageIo.read(file);
return image;
}catch(IOException e){
e.printStrackTrace();
}
return null;
}
保存BufferedImage 对象为图像文件
public void writeImageFile(BufferedImage bi) throws IOException{
File outputfile = new File(“save.png”);
ImageIO.write(bi,“png”,outputfile);
}
三.截取图片功能
boolean cropImage(InputStream inputStream,int x,int y,int w,int h,String sufix,File file) throws IOException {
BufferedImage bufferedImage = ImageIO.read(inputStream);
bufferedImage = bufferedImage.getSubimage(x,y,w,h);
return ImageIO.write(bufferedImage,sufix,file);
}
四.简单的面向过程的截取代码
见连接 面向过程的简单的截取
五.有处理效果更好的插件。建议选择用插件Thumbnails 。