package cn.gistack.resource.panoramaUtils; import org.im4java.core.*; import org.im4java.process.ProcessStarter; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; /** * @author kelu */ public class Img4JavaUtil { static { //判断是否是windows系统 if(OSinfo.isWindows()) { System.out.println("------------ START 初始化ImageMagickPath -------------"); ProcessStarter.setGlobalSearchPath("D:/im4java/ImageMagick-7.1.1-Q16-HDRI"); System.out.println("------------ END 初始化ImageMagickPath -------------"); } else if (OSinfo.isLinux()) { System.out.println("------------ START 初始化ImageMagickPath -------------"); // ProcessStarter.setGlobalSearchPath("D:/im4java/ImageMagick-7.1.1-Q16-HDRI"); System.out.println("------------ END 初始化ImageMagickPath -------------"); } } /** * 裁剪图片 * @param inImgPath 源图片地址 * @param outImgPath 目标图片地址 * @param width 宽 * @param height 高 * @param x 起点横坐标 * @param y 起点纵坐标 * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public static void cropImg(String inImgPath,String outImgPath,Integer width,Integer height,Integer x,Integer y) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); //宽 高 起点横坐标 起点纵坐标 operation.crop(width, height, x, y); operation.addImage(outImgPath); cmd.run(operation); } /** * 裁剪图片 * @param inImgPath 源图片地址 * @param outImgPath 目标图片地址 * @param width 宽 * @param height 高 * @param x 起点横坐标 * @param y 起点纵坐标 * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ // public void cropImg(String inImgPath,String outImgPath,Integer width,Integer height,Integer x,Integer y) // throws IOException, InterruptedException, IM4JavaException{ // ConvertCmd cmd = new ConvertCmd(); // IMOperation operation = new IMOperation(); // operation.addImage(inImgPath); // //宽 高 起点横坐标 起点纵坐标 // operation.crop(width, height, x, y); // operation.addImage(outImgPath); // cmd.run(operation); // } /** * 裁剪中心化图片 * @param inImgPath 源图片地址 * @param outImgPath 目标图片地址 * @param width 宽 * @param height 高 * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public void cropCenterImg(String inImgPath,String outImgPath,Integer width,Integer height) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); Info info = new Info(inImgPath); Integer init_width = info.getImageWidth(); Integer init_height = info.getImageHeight(); // 如果裁剪的宽高都大于原始图片宽高 则先等比放大再裁剪 if(width>init_width || height>init_height){ // 等比放大 Integer temp_width = width; if(init_height getImgInfoRT( File imageFile) throws IOException { HashMap stringHashMap = new HashMap(); try { ImageInputStream imageInputStream = ImageIO.createImageInputStream(imageFile); final Iterator readers = ImageIO.getImageReaders(imageInputStream); if(readers.hasNext()){ ImageReader reader = readers.next(); reader.setInput(imageInputStream,true); int width = reader.getWidth(0); int height = reader.getHeight(0); stringHashMap.put("width",width); stringHashMap.put("height",height); imageInputStream.close(); } } catch (IOException e) { System.err.println("IOException "+e.getMessage()); } return stringHashMap; } /** * 等比缩放图片 * @param inImgPath * @param outImgPath * @param width 宽度不为空时 以宽度为准,为空时以高度为准(不能同时为空) * @param height * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public static void resizeImg(String inImgPath,String outImgPath,Integer width,Integer height) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); //等比缩放图片 operation.resize(width, height);//高度为null则按宽度缩放 operation.addImage(outImgPath); cmd.run(operation); } /** * 等比缩放 (使用像素平均缩小) * @param inImgPath * @param outImgPath * @param width * @param height * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public static void scaleImg(String inImgPath,String outImgPath,Integer width,Integer height) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); //缩略图 operation.scale(width,height); operation.addImage(outImgPath); cmd.run(operation); } /** * 把原图裁剪成正方形 * @param inImgPath * @param operation * @return * @throws IM4JavaException */ public static IMOperation getCenterSquare(String inImgPath,IMOperation operation)throws IM4JavaException{ Info info = new Info(inImgPath); Integer init_width = info.getImageWidth(); Integer init_height = info.getImageHeight(); if (init_width > init_height) { init_width = init_height; } else if (init_width < init_height) { init_height = init_width; } operation.gravity("center"); operation.crop(init_width, init_height,0,0); return operation; } /** * 缩略图 (专门用于将非常大的图像缩小为小缩略图) * @param inImgPath * @param outImgPath * @param width * @param height * @param editType = c 取中心化缩略图,否则取原等比缩略图 * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public void thumbnailImg(String inImgPath,String outImgPath,Integer width,Integer height,String editType) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); //取中心化或者原图同比 if(editType!=null && editType.equals("c")) { //分析宽高 先原图等比生成缩略图(缩略规则按原图大的一边为准取值) Info info = new Info(inImgPath); Integer init_width = info.getImageWidth(); Integer init_height = info.getImageHeight(); double width_v = (double)init_width/width; double height_v = (double)init_height/height; //原图是正方形 /*if(init_width == init_height){ operation.thumbnail(width,height); //原图是宽大于高的长方形 }else */if(init_width >= init_height){ if (width_v >= height_v) { operation.thumbnail(null,height); } else if (width_v < height_v) { operation.thumbnail(width,null); } //原图是高大于宽的长方形 }else if(init_width < init_height){if (width_v > height_v) { operation.thumbnail(null,height); } else if (width_v <= height_v) { operation.thumbnail(width,null); } } //再中心化截图 operation.gravity("center"); operation.crop(width, height,0,0); }else{ operation.thumbnail(width,height); } operation.addImage(outImgPath); cmd.run(operation); } /** * 旋转图片 * @param inImgPath * @param outImgPath * @param x 旋转角度 * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public void rotateImg(String inImgPath,String outImgPath,Double x) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); operation.rotate(x); operation.addImage(outImgPath); cmd.run(operation); } /** * 缩略图 (原图画质缩略) * @param inImgPath * @param outImgPath * @param width * @param height * @param editType * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public void sampleImg(String inImgPath,String outImgPath,Integer width,Integer height,String editType) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); //取中心化或者原图同比 if(editType!=null && editType.equals("center")) { getCenterSquare(inImgPath,operation); } operation.sample(width,height); // operation.quality(5.0); //设置生成图片质量 operation.addImage(outImgPath); cmd.run(operation); } /** * 将图片变成黑白图片 * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ public void monochrome(String inImgPath,String outImgPath) throws IOException, InterruptedException, IM4JavaException{ ConvertCmd cmd = new ConvertCmd(); IMOperation operation = new IMOperation(); operation.addImage(inImgPath); operation.monochrome(); operation.addImage(outImgPath); cmd.run(operation); } /** * 给图片加水印 * @param: srcPath源图片路径 */ public static void addImgText(String inImgPath,String outImgPath,String str)throws IOException, InterruptedException, IM4JavaException{ IMOperation operation = new IMOperation(); operation.font("宋体").gravity("southeast").pointsize(18).fill("#BCBFC8") .draw("text 5,5 "+str); operation.encoding("UTF-8"); operation.addImage(); operation.addImage(); ConvertCmd convert = new ConvertCmd(); convert.run(operation, inImgPath,outImgPath); } /** * 创建文件名称 * @param folder * @param fileName * @return */ public static File createFile(String folder, String fileName) { File serverFile; String suffix = getSuffix(fileName); String destFileName = null; long timeMillis = System.currentTimeMillis(); int i = 1; do { if (suffix.length() == 0) { destFileName = String.format("%s_%d", timeMillis, i++); } else { destFileName = String.format("%s_%d.%s", timeMillis, i++, suffix); } serverFile = new File(folder, destFileName); } while (serverFile.exists()); serverFile.getParentFile().mkdirs(); return serverFile; } /** * 生成图片名称(根据旧的文件类型) * @param rootPath 文件目录地址 * @param oldFileName 文件相对路径 * @param type 操作类型 c :中心化、o :原比例、自定义 * @return */ public String createFileName(String rootPath,String oldFileName,int width,int height,String type) { // 初始化目录 String pathName = oldFileName.substring(0,oldFileName.lastIndexOf("/")); String newFilePath = rootPath + pathName; File dirFile = new File(newFilePath); if (!dirFile.exists()) { dirFile.mkdirs(); } // 生成文件名 String imgName =oldFileName.substring(oldFileName.lastIndexOf("/")); String a = imgName.substring(0,imgName.lastIndexOf(".")); String b = imgName.substring(imgName.lastIndexOf(".")); return newFilePath + a + "_"+ width + "x"+ height +"_" + type + b; } /** * 截取文件名称 * @param filePath * @return */ public static String getSuffix(String filePath){ return filePath.substring(filePath.lastIndexOf(".")); } /** * main方法测试 * @param args * @throws IOException * @throws InterruptedException * @throws IM4JavaException */ // public static void main(String[] args) throws IOException, InterruptedException, IM4JavaException{ // String inImgPath = "D:\\Documents\\Pictures\\1.jpg"; // String outImgPath = "D:\\Documents\\Pictures\\2.jpg"; // Img4JavaUtil test = new Img4JavaUtil(); // 中心化缩略图(常用) // test.thumbnailImg(inImgPath,outImgPath,400,400,"c"); // 裁剪图片 // test.cropImg(inImgPath,outImgPath+"裁剪-300x300.jpg",300,300,0,0); // 获取图片信息 // test.getImgInfo(inImgPath); // 等比缩放 // test.resizeImg(inImgPath,outImgPath+"等比缩放-w300.jpg",300,null); // 旋转图片 // test.rotateImg(inImgPath,outImgPath+"旋转45.jpg",45.0); // 转黑白图片 // test.monochrome(inImgPath,outImgPath+"转黑白.jpg"); // 加水印 // test.addImgText(inImgPath,outImgPath+"加水印.jpg","CCTV-100"); // 原图质量缩放 // test.scaleImg(inImgPath,outImgPath+"缩略图scale.jpg",100,null); // 自动中心化裁剪 // test.cropCenterImg(inImgPath,outImgPath+"中心.jpg",400,300); // } }