package nowcoder.pictureZoom; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; public class ImageOperater { /** * 左上方 */ public static final int LEFT_UPPER = 1; /** * 右上方 */ public static final int RIGHT_UPPER = 2; /** * 左下方 */ public static final int LEFT_LOWER = 3; /** * 右下方 */ public static final int RIGHT_LOWER = 4; /** * 中间 */ public static final int CENTER = 5; private BufferedImage image; private String path; private String type; /** * 用File构造一个ImageOperater对象 * @param file 图像文File对象 */ public ImageOperater(File file) { try { this.image = ImageIO.read(file); this.path = file.getAbsolutePath(); this.type = getType(this.path); } catch (IOException e) { e.printStackTrace(); } } /** * 用路径构造一个ImageOperater对象 * @param path 图像文件路径 */ public ImageOperater(String path) { this.path = path; readImage(this.path); this.type = getType(this.path); } /** * 使用路径构造BufferedImage对象 * @param path 图像文件路径 */ private void readImage(String path){ try { this.image = ImageIO.read(new File(path)); } catch (IOException e) { e.printStackTrace(); } } /** * 获取文件类型 * @param path * @return */ private String getType(String path){ return path.substring(path.lastIndexOf(".")+1); } /** * 等比放大图片 */ public ImageOperater blowUpImageEqualProportion(int ratio){ //构造一个按原图放大的图片 BufferedImage image = new BufferedImage(this.image.getWidth()*ratio, this.image.getHeight()*ratio, BufferedImage.TYPE_INT_RGB); //把原图画到构造的图片上 image.getGraphics().drawImage(this.image,0,0, this.image.getWidth()*ratio, this.image.getHeight()*ratio, null); this.image = image; //返回ImageOperater对象,以便链式处理图片 return this; } /** * 等比放大图片 */ public ImageOperater reduceEqualProportion(int ratio){ //构造一个按原图缩放的图片 BufferedImage image = new BufferedImage(this.image.getWidth()/ratio, this.image.getHeight()/ratio, BufferedImage.TYPE_INT_RGB); //把原图画到构造的图片上 image.getGraphics().drawImage(this.image,0,0,this.image.getWidth()/ratio, this.image.getHeight()/ratio, null); this.image = image; //返回ImageOperater对象,以便链式处理图片 return this; } /** * 缩放到指定大小 */ public ImageOperater cutNotEqualProportion(int width,int height){ //构造一个指定大小的图片 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //把原图画到构造的图片上 image.getGraphics().drawImage(this.image,0,0,width, height,null); this.image = image; //返回ImageOperater对象,以便链式处理图片 return this; } /** * 添加水印 * @param waterMarkFile 水印文件 * @param POSITION 添加水印的位置 * @return */ public ImageOperater addWatermark(File waterMarkFile,int POSITION){ BufferedImage waterMark = null; try { waterMark = ImageIO.read(waterMarkFile); } catch (IOException e) { e.printStackTrace(); } //构造一个和原图一样大小的图片 BufferedImage image = new BufferedImage(this.image.getWidth(), this.image.getHeight(), BufferedImage.TYPE_INT_RGB); //把原图画到构造的图片上 image.getGraphics().drawImage(this.image,0,0,this.image.getWidth(), this.image.getHeight(), null); switch (POSITION) { case LEFT_UPPER: image.getGraphics().drawImage(waterMark,0,0, waterMark.getWidth(), waterMark.getHeight(),null); break; case RIGHT_UPPER: image.getGraphics().drawImage(waterMark,image.getWidth()-waterMark.getWidth(),0, waterMark.getWidth(), waterMark.getHeight(),null); break; case LEFT_LOWER: image.getGraphics().drawImage(waterMark,0,image.getHeight()-waterMark.getHeight(), waterMark.getWidth(), waterMark.getHeight(),null); break; case RIGHT_LOWER: image.getGraphics().drawImage(waterMark,image.getWidth()-waterMark.getWidth(), image.getHeight()-waterMark.getHeight(), waterMark.getWidth(), waterMark.getHeight(),null); break; case CENTER: image.getGraphics().drawImage(waterMark,(image.getWidth()-waterMark.getWidth())/2, (image.getHeight()-waterMark.getHeight())/2, waterMark.getWidth(), waterMark.getHeight(),null); break; default: throw new RuntimeException("指定位置不正确!"); } this.image = image; return this; } /** * 覆盖原图保存 */ public ImageOperater save(){ FileOutputStream fos = null; try { fos = new FileOutputStream(new File(path)); //保存文件 ImageIO.write(image, this.type, fos); } catch (Exception e) { e.printStackTrace(); } //关闭流 try { if(fos!=null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } return this; } /** * 保存到指定路径 * @param path */ public ImageOperater save(String path,String name){ FileOutputStream fos = null; File file = new File(path); //如果路径不存在,尝试创建文件夹 if(!file.exists()){ file.mkdirs(); } //如果路径不是文件则抛出异常 if(file.isFile()){ throw new RuntimeException("指定路径不是文件夹!"); } file = new File(file, name+"."+type); try { fos = new FileOutputStream(file); ImageIO.write(image, this.type, fos); } catch (Exception e) { e.printStackTrace(); } //关闭流 try { if(fos!=null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } return this; } /** * 保存到指定路径(绝对路径,相对路径) * @param path */ public ImageOperater save(String path,String relativePath,String name){ return save(path+File.pathSeparator+relativePath,name); } /** * 获取BufferedImage对象 * @return */ public BufferedImage getImage(){ return this.image; } /** * 获取图片绝对路径 * @return */ public String getAbsolutePath(){ return this.path; } /** * 获取文件类型 * @return */ public String getImageType(){ return this.type; } } Client: package nowcoder.pictureZoom; import java.io.File; public class Client { public static void main(String[] args) { File file = new File("D:/0.jpg"); File watermark = new File("D:/1.png"); ImageOperater operater = new ImageOperater(file); operater.reduceEqualProportion(3) //缩小到三分之一并保存 .save("D:","1") //在右上方加上水印并保存 .addWatermark(watermark, ImageOperater.RIGHT_UPPER) .save("D:","2") //下面做个骰子 .addWatermark(watermark, ImageOperater.LEFT_UPPER) .addWatermark(watermark, ImageOperater.LEFT_LOWER) .addWatermark(watermark, ImageOperater.RIGHT_LOWER) .addWatermark(watermark, ImageOperater.CENTER) .save("D:","3"); operater = new ImageOperater(file); //当然你也可以按照自己的尺寸剪裁 operater.cutNotEqualProportion(200, 300).save("D:", "cut"); File folder = new File("D:/pic"); Batch(folder, 200, 200); } public static void Batch(File file,int weidth,int heigth){ if(!file.isDirectory()){ return; } for(File f:file.listFiles()){ if(f.isFile()){ ImageOperater operater = new ImageOperater(f); operater.cutNotEqualProportion(weidth, heigth).save(); }else{ //递归处理 Batch(f,weidth,heigth); } } } } 原始文件: 处理后: 这次顺便也把之前一期给头像加个1也一起做了
点赞 评论

相关推荐

牛客网
牛客企业服务