java 图片转换、加水印等工具类

2024-03-13 21:08

本文主要是介绍java 图片转换、加水印等工具类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

技术实现:主要使用的jmagick.jar 和jdk本身自带的图像处理jar


主要方法:

1.获取图片信息
2.压缩图片
3.水印(文字)
4.切图
5.按照指定的宽高进行图片缩放
6.图片按照等比缩放
7.图片缩放
8.图片按照等比缩放
9.给图片添加文字水印  
10.给图片添加水印、可设置水印的旋转角度,并调整大小
11.根据文字生成图片
12.将多个小图片合成一张大jpg图  (小的jpg图片按照行列顺序平铺)
13.彩色转为黑白
14. 添加图片水印---指定图片水印的4个位子(0,1,2,3,4,5)
15.图片加文字文字(五个位置,分别是图片的左上角,右上角,中间,左下角,右下角)对应参数 int weizhi 可以取0到4)
16.通过  ImageMagick 的 convert 转换成实现psd文件转换成其他图片
17.取得汉字的长度


安装步骤:

jar包地址  http://downloads.jmagick.org/6.3.9/      
* window下使用的是:    jmagick-win-6.3.9-Q16.zip 和  ImageMagick-6.3.9-0-Q16-windows-dll.exe
* linux下使用的是 :        JMagick-6.2.6-0.tar.gz    和 ImageMagick-x86_64-pc-linux-gnu.tar.gz             
* doc地址:   http://downloads.jmagick.org/jmagick-doc/
* 
* windows安装方法:
*  一 .  安装 ImageMagick-6.3.9-0-Q16-windows-dll.exe
*  二 .  将 安装目录下 “C:/Program Files/ImageMagick-6.3.9-Q8/ ”(按自己所安装的目录找) (按自己所安装的目录找) 下的所有dll文件 copy 到系统盘下的 “C:/WINDOWS/system32/”文件夹里
*  三 .  配置环境变量
*        在环境变量path里添加新的值 “C:/Program Files/ImageMagick-6.3.9-Q16”
*  四 .  解压jmagick-win-6.3.9-Q16.zip 
*        将 jmagick.dll 复制到系统盘下的 “C:/WINDOWS/system32/”文件夹里 和../xxx/resin-4.0.4/win32/下
*        
*        
*  linux安装方法:     
*  一 . 安装jpeg包:   
*     tar -zvxf jpegsrc.v6b.tar.gz 
* 		  cd jpeg-6b/
* 		  ./configure --enable-shared --enable-static ;
* 		  make ; 
* 		  mkdir /usr/local/man/
* 		  mkdir /usr/local/man/man1
* 		  make install 
*  二 . 安装png包:
*         bzip2 -d libpng-1.2.18.tar.bz2  
*     tar -xvf libpng-1.2.18.tar 
*         cd libpng-1.2.18
*     cp scripts/makefile.std makefile
*     make
*     make install 
* 三 . 安装ImageMagick包   
*      tar xzvf ImageMagick.tar.gz
* 	      cd ImageMagick-6.3.5/
* 	      ./configure --prefix=/usr/local/imgtools/ImageMagick --enable-share --enable-static
* 	      make
* 	      make install  
* 四 .  安装JMagick包   
*    tar xzvf JMagick-6.2.6-0.tar.gz 
* 	      autoconf
* 	      ./configure --prefix=/usr/local/imgtools/JMagick --with-magick-home=/usr/local/imgtools/ImageMagick --enable-share --enable-static
* 	      make all
* 	      make install 
* 五. vi /etc/profile   
* 		  加入 PATH=$PATH:/usr/local/imgtools/ImageMagick/bin
* 		    export LD_LIBRARY_PATH=:/usr/local/imgtools/JMagick/lib:/usr/local/imgtools/ImageMagick/lib
* 		    export DYLD_LIBRARY_PATH=:/usr/local/imgtools/JMagick/lib:/usr/local/imgtools/ImageMagick/lib
* 		    export CLASSPATH=$CLASSPATH:/usr/local/imgtools/JMagick-6.2.4-1/classes
* 		    export PATH 
* 六. ln -s /usr/local/imgtools/JMagick/lib/libJMagick.so /usr/lib/libJMagick.so
*   	   不做这步会报一个找不到lib.path的错误
* 七.java代码使用一下包
*   		/usr/local/imgtools/JMagick/lib/jmagick.jar

3.代码集,我们没有整理,直接复制的java类,请自己挑选自己用的上的方法。

import info.aduna.io.FileUtil;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.apache.commons.lang.xwork.StringUtils;
import org.apache.log4j.Logger;
import com.brainsoon.bsrcm.common.utils.BaseCommonUtil;
import com.brainsoon.bsrcm.system.support.CacConver;
import com.channelsoft.appframe.utils.WebappConfigUtil;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import magick.CompressionType;
import magick.DrawInfo;
import magick.ImageInfo;
import magick.MagickException;
import magick.MagickImage;
import magick.PixelPacket;
import magick.PreviewType;
/**
* 图像处理工具类
* (最好用最新版本)
* jar包地址  http://downloads.jmagick.org/6.3.9/      
* window下使用的是:    jmagick-win-6.3.9-Q16.zip 和  ImageMagick-6.3.9-0-Q16-windows-dll.exe
* linux下使用的是 :        JMagick-6.2.6-0.tar.gz    和 ImageMagick-x86_64-pc-linux-gnu.tar.gz             
* doc地址:   http://downloads.jmagick.org/jmagick-doc/
* 
* windows安装方法:
*  一 .  安装 ImageMagick-6.3.9-0-Q16-windows-dll.exe
*  二 .  将 安装目录下 “C:/Program Files/ImageMagick-6.3.9-Q8/ ”(按自己所安装的目录找) (按自己所安装的目录找) 下的所有dll文件 copy 到系统盘下的 “C:/WINDOWS/system32/”文件夹里
*  三 .  配置环境变量
*        在环境变量path里添加新的值 “C:/Program Files/ImageMagick-6.3.9-Q16”
*  四 .  解压jmagick-win-6.3.9-Q16.zip 
*        将 jmagick.dll 复制到系统盘下的 “C:/WINDOWS/system32/”文件夹里 和../xxx/resin-4.0.4/win32/下
*        
*        
*  linux安装方法:     
*  一 . 安装jpeg包:   
*     tar -zvxf jpegsrc.v6b.tar.gz 
* 		  cd jpeg-6b/
* 		  ./configure --enable-shared --enable-static ;
* 		  make ; 
* 		  mkdir /usr/local/man/
* 		  mkdir /usr/local/man/man1
* 		  make install 
*  二 . 安装png包:
*         bzip2 -d libpng-1.2.18.tar.bz2  
*     tar -xvf libpng-1.2.18.tar 
*         cd libpng-1.2.18
*     cp scripts/makefile.std makefile
*     make
*     make install 
* 三 . 安装ImageMagick包   
*      tar xzvf ImageMagick.tar.gz
* 	      cd ImageMagick-6.3.5/
* 	      ./configure --prefix=/usr/local/imgtools/ImageMagick --enable-share --enable-static
* 	      make
* 	      make install  
* 四 .  安装JMagick包   
*    tar xzvf JMagick-6.2.6-0.tar.gz 
* 	      autoconf
* 	      ./configure --prefix=/usr/local/imgtools/JMagick --with-magick-home=/usr/local/imgtools/ImageMagick --enable-share --enable-static
* 	      make all
* 	      make install 
* 五. vi /etc/profile   
* 		  加入 PATH=$PATH:/usr/local/imgtools/ImageMagick/bin
* 		    export LD_LIBRARY_PATH=:/usr/local/imgtools/JMagick/lib:/usr/local/imgtools/ImageMagick/lib
* 		    export DYLD_LIBRARY_PATH=:/usr/local/imgtools/JMagick/lib:/usr/local/imgtools/ImageMagick/lib
* 		    export CLASSPATH=$CLASSPATH:/usr/local/imgtools/JMagick-6.2.4-1/classes
* 		    export PATH 
* 六. ln -s /usr/local/imgtools/JMagick/lib/libJMagick.so /usr/lib/libJMagick.so
*   	   不做这步会报一个找不到lib.path的错误
* 七.java代码使用一下包
*   		/usr/local/imgtools/JMagick/lib/jmagick.jar
* 
* 
* @author tanghui
* @update 2012-07-20
* @updateDATE 2012-08-19
*
*/public class ImageHelps {protected static final Logger logger = Logger.getLogger(ImageHelps.class);public static String  imgConverPath;static{//不能漏掉这个,不然jmagick.jar的路径找不到System.setProperty("jmagick.systemclassloader","no");imgConverPath = WebappConfigUtil.getParameter("imgConverPath");//System.setProperty("java.awt.headless", "false"); //System.out.println("-------请求的路径为:-------" + System.getProperty("java.library.path"));}public static int MARK_POSITION_LEFT_UP = 0;public static int MARK_POSITION_RIGHT_UP = 1;public static int MARK_POSITION_LEFT_DOWN = 2;public static int MARK_POSITION_RIGHT_DOWN = 3;/*** 获取图片信息* @param filePath 源文件路径*/public static  ImagesInfo getImgInfo(String filePath) throws MagickException{ImageInfo info = null;MagickImage image = null;Dimension imageDim = null;ImagesInfo imageInfo = new ImagesInfo();FileInputStream f = null;try {if(CacConver.exitFile(filePath)){String imgType = filePath.substring(filePath.lastIndexOf(".")+1, filePath.length());if(CacConver.isNeedImgFormat(imgType)){f = new FileInputStream (filePath) ;  //数组的大小和文件的大小一致  byte[] b = new byte[f.available()];   f.read(b);  info = new ImageInfo();image = new MagickImage(info,b);imageDim = image.getDimension();int size = image.sizeBlob();int width = imageDim.width;int height = imageDim.height;String fileType = image.getImageFormat();double xResolution =  image.getXResolution(); String xResolutionStr = String.valueOf(xResolution);if(xResolutionStr.indexOf(".") != -1 && xResolutionStr.substring(xResolutionStr.indexOf(".")+1, xResolutionStr.length()).length() >=2){xResolution = Long.parseLong(xResolutionStr.substring(0, xResolutionStr.indexOf(".")) + xResolutionStr.substring(xResolutionStr.indexOf(".")+1, xResolutionStr.indexOf(".")+3));}double yResolution =  image.getYResolution();String yResolutionStr = String.valueOf(yResolution);if(yResolutionStr.indexOf(".") != -1 && yResolutionStr.substring(yResolutionStr.indexOf(".")+1, yResolutionStr.length()).length() >= 2){yResolution = Long.parseLong(yResolutionStr.substring(0, yResolutionStr.indexOf(".")) + yResolutionStr.substring(yResolutionStr.indexOf(".")+1,  yResolutionStr.indexOf(".")+3));}int quality = image.getQuality();imageInfo.setFileName(filePath.substring(filePath.lastIndexOf("/")+1,filePath.length()));   //文件名称imageInfo.setWidth(width+" Pixel");    //文件宽度imageInfo.setHeight(height+" Pixel");    //文件高度if("jpeg".equalsIgnoreCase(fileType)){imageInfo.setFileType("jpg");}else{imageInfo.setFileType(fileType);    //文件类型 }imageInfo.setSize(size/1024+" KB");   //文件大小imageInfo.setxResolution(xResolution+" dpi");    //水平分辨率imageInfo.setyResolution(yResolution+" dpi");     //垂直分辨率imageInfo.setFileSize(width  + " x " +height);imageInfo.setImgQuality(quality + "");  //图片压缩比}else{logger.debug("【" + filePath + "】文件格式不支持!");}}} catch(Exception e){logger.error("获取【" + filePath + "】图片信息失败!");}finally {if(image != null){image.destroyImages();}if(f != null){try {f.close();} catch (IOException e) {}}}return imageInfo;  }/*** 压缩图片* @param filePath 源文件路径* @param toPath   缩略图路径*/public static  void createThumbnail(String filePath, String toPath) throws MagickException{ImageInfo info = null;MagickImage image = null;Dimension imageDim = null;MagickImage scaled = null;FileInputStream f = null;try {if(CacConver.exitFile(filePath)){f = new FileInputStream (filePath) ;  //数组的大小和文件的大小一致  byte[] b = new byte[f.available()];   f.read(b);  info = new ImageInfo();image = new MagickImage(info,b);imageDim = image.getDimension();int wideth = imageDim.width;int height = imageDim.height;scaled = image.scaleImage(wideth, height);//小图片文件的大小.scaled.setFileName(toPath);scaled.writeImage(info);}} catch(Exception e){logger.error("压缩【" + filePath + "】图片失败!");}finally {if(scaled != null){scaled.destroyImages();}if(f != null){try {f.close();} catch (IOException e) {}}}  }/*** 水印(文字)* @param filePath 源文件路径* @param toImg    修改图路径* @param text     名字(文字内容自己随意)* @throws MagickException*/public static void initTextToImg(String filePath, String toImg,  String text) throws MagickException{MagickImage aImage = null; ImageInfo info = null;FileInputStream f = null;try {if(CacConver.exitFile(filePath)){f = new FileInputStream (filePath) ;  //数组的大小和文件的大小一致  byte[] bb = new byte[f.available()];   f.read(bb);  info = new ImageInfo();aImage = new MagickImage(info,bb);if (filePath.toUpperCase().endsWith("JPG") || filePath.toUpperCase().endsWith("JPEG")) {info.setCompression(CompressionType.JPEGCompression); //压缩类别为JPEG格式info.setPreviewType(PreviewType.JPEGPreview); //预览格式为JPEG格式info.setQuality(95);}Dimension imageDim = aImage.getDimension();int wideth = imageDim.width;int height = imageDim.height;if (wideth > 660) {height = 660 * height / wideth;wideth = 660;}int a = 0;int b = 0;String[] as = text.split("");for (String string : as) {if(string.matches("[\u4E00-\u9FA5]")){a++;}if(string.matches("[a-zA-Z0-9]")){b++;}}int tl = a*12 + b*6 + 300;MagickImage scaled = aImage.scaleImage(wideth, height);if(wideth > tl && height > 5){DrawInfo aInfo = new DrawInfo(info);aInfo.setFill(PixelPacket.queryColorDatabase("white"));aInfo.setUnderColor(new PixelPacket(0,0,0,100));aInfo.setPointsize(12);aInfo.setTextAntialias(true);aInfo.setOpacity(0);aInfo.setText(text);aInfo.setGeometry("+" + (wideth-tl) + "+" + (height-5));scaled.annotateImage(aInfo);scaled.rotateImage(80);}scaled.setFileName(toImg);scaled.writeImage(info);scaled.destroyImages();}} catch(Exception e){logger.error("给【 " + filePath + "】图片添加文字水印失败!");}finally {if(aImage != null){aImage.destroyImages();}if(f != null){try {f.close();} catch (IOException e) {}}}}/*** 切图* @param filePath 源图路径* @param toPath  修改图路径* @param w   宽      * @param h    高    * @param x   x轴     * @param y   y轴* @throws MagickException*/public static void cutImg(String filePath, String toPath, int w, int h, int x, int y) throws MagickException {ImageInfo info = null;MagickImage image = null;MagickImage cropped = null;Rectangle rect = null;FileInputStream f = null;try {if(CacConver.exitFile(filePath)){f = new FileInputStream (filePath) ;  //数组的大小和文件的大小一致  byte[] b = new byte[f.available()];   f.read(b);  info = new ImageInfo();image = new MagickImage(info,b);rect = new Rectangle(x, y, w, h);cropped = image.cropImage(rect);cropped.setFileName(toPath);cropped.writeImage(info);}} catch(MagickException e){logger.error("【 " + filePath + "】图片切图失败!");} catch (FileNotFoundException e) {logger.error("【 " + filePath + "】图片不存在!");} catch (IOException e) {logger.error("【 " + filePath + "】图片缩放失败!");}finally {if (cropped != null) {cropped.destroyImages();}if(f != null){try {f.close();} catch (IOException e) {}}}}/*** 按照指定的宽高进行图片缩放* @param filePath 原图片路径* @param toPath 缩放后的图片路径* @param w   缩放后图片宽度* @param h   缩放后图片高度*/public static void zoomImg(String filePath, String toPath, int w, int h) throws FileNotFoundException  {FileOutputStream fileOutputStream = null;  try {if(CacConver.exitFile(filePath)){//获取原文件的宽高Image srcImg = ImageIO.read(new File(filePath));int width=srcImg.getWidth(null);int height=srcImg.getHeight(null);//判断 如果图片的宽度和高度太小,或者为0,则采用原图片的宽和高if(w < 5){w = width;}if(h < 5){h = height;}if(w>width && h >height){   //如果大于图片原始的宽度和高度---使用原始尺寸w = width;h = height;}else{double dd =  0;  //计算出高的压缩比例if(width >height){dd =  (double)height/width;  //计算出高的压缩比例}else{dd =  (double)width/height;  //计算出高的压缩比例}if(w>= width && h < height){   //如果大于图片原始的宽度但是小于原始图片的高度---则使用图片宽度进行缩放w = (int) (w*dd);}else if(w< width && h >= height){   //如果小于图片原始的宽度但是大于原始图片的高度---则使用图片高度进行缩放h = (int) (h*dd);}else if(w< width && h < height){  if(width >height){h = (int) (h*dd);}else{w = (int) (w*dd);}}else{w = width;h = height;}}	 fileOutputStream = new FileOutputStream(new File(toPath));  BufferedImage bufferedImage = new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);   bufferedImage.getGraphics().drawImage(srcImg.getScaledInstance(w,h,srcImg.SCALE_SMOOTH), 0, 0, null);  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fileOutputStream);   encoder.encode(bufferedImage);   fileOutputStream.close(); }} catch (Exception e) {logger.error("【 " + filePath + "】图片缩放失败!");}  finally {}}/*** 图片按照等比缩放* @param filePath 原图片路径* @param toPath 缩放后的图片路径*/public static void zoomSureImg(String filePath, String toPath)  {
//    	  MagickImage image = null;
//        MagickImage scaleImg = null;FileInputStream f = null;FileOutputStream fileOutputStream = null;  try {if(CacConver.exitFile(filePath)){f = new FileInputStream (filePath) ;  //数组的大小和文件的大小一致  byte[] b = new byte[f.available()];   f.read(b);  
//        		 ImageInfo info = new ImageInfo();
//        	     image = new MagickImage(info,b);//获取原文件的宽高Image srcImg = ImageIO.read(new File(filePath));int width=srcImg.getWidth(null);int height=srcImg.getHeight(null);int  w = BaseCommonUtil.IMGMIXSIZE;  //最小尺寸int  h = BaseCommonUtil.IMGMIXSIZE;//判断 如果图片的宽度和高度太小,或者为0,则采用原图片的宽和高if(width != 0 && height != 0){   //如果大于图片原始的宽度和高度---使用原始尺寸
// 	            	  width = (int) (width* BaseCommonUtil.IMGPROP);  //缩放比例
//	       	    	  height = (int) (height * BaseCommonUtil.IMGPROP);if(w>= width && h >= height){   //如果最小尺寸大于图片原始的宽度和高度---使用原始尺寸w = width;h = height;}else{double dd =  0;  //计算出高的压缩比例if(width >height){dd =  (double)height/width;  //计算出高的压缩比例}else{dd =  (double)width/height;  //计算出高的压缩比例}if(w>= width && h < height){   //如果大于图片原始的宽度但是小于原始图片的高度---则使用图片宽度进行缩放w = (int) (w*dd);}else if(w< width && h >= height){   //如果小于图片原始的宽度但是大于原始图片的高度---则使用图片高度进行缩放h = (int) (h*dd);}else if(w< width && h < height){  if(width >height){h = (int) (h*dd);}else{w = (int) (w*dd);}}else{w = width;h = height;}}	 }fileOutputStream = new FileOutputStream(new File(toPath));  BufferedImage bufferedImage = new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);   bufferedImage.getGraphics().drawImage(srcImg.getScaledInstance(w,h,srcImg.SCALE_SMOOTH), 0, 0, null);  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fileOutputStream);   encoder.encode(bufferedImage);   fileOutputStream.close(); }} catch (Exception e) {e.printStackTrace();logger.error("【 " + filePath + "】图片缩放失败!");} finally {if(f != null){try {f.close();} catch (IOException e) {logger.error("关闭IO流失败!");}}}}/*** 图片缩放* @param filePath 图片路径* @param height 高度* @param width 宽度* @param bb 比例不对时是否需要补白*/public static void zoomPerImg(String filePath, String toPath,int height, int width, boolean bb) {try {double ratio = 0; //缩放比例    File f = new File(filePath);   BufferedImage bi = ImageIO.read(f);   Image itemp = bi.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH);   //计算比例   if ((bi.getHeight() > height) || (bi.getWidth() > width)) {   if (bi.getHeight() > bi.getWidth()) {   ratio = (new Integer(height)).doubleValue() / bi.getHeight();   } else {   ratio = (new Integer(width)).doubleValue() / bi.getWidth();   }   AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);   itemp = op.filter(bi, null);   }   if (bb) {   BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   Graphics2D g = image.createGraphics();   g.setColor(Color.white);   g.fillRect(0, 0, width, height);   if (width == itemp.getWidth(null))   g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);   else  g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);   g.dispose();   itemp = image;   }ImageIO.write((BufferedImage) itemp, "jpg", f);   } catch (IOException e) {e.printStackTrace();}}/*** 图片按照等比缩放* @param filePath 原图片路径* @param toPath 缩放后的图片路径* @param w 视频宽* @param h  视频高*/public static void zoomPerImg(String filePath, String toPath, int w, int h)  {BufferedImage dstImage = null;try {if(CacConver.exitFile(filePath)){//获取原文件的宽高BufferedImage srcImg = ImageIO.read(new File(filePath));int width=srcImg.getWidth();int height=srcImg.getHeight();int newW = w;int newH = h;//判断 如果图片的宽度和高度太小,或者为0,则采用原图片的宽和高if(width != 0 && height != 0){   //如果大于图片原始的宽度和高度---使用原始尺寸
// 	            	  w = (int) (width* BaseCommonUtil.VIDEO_IMG_SIZE);  //缩放比例
//	       	    	  h = (int) (height * BaseCommonUtil.VIDEO_IMG_SIZE);if(width<= w*BaseCommonUtil.VIDEO_IMG_SIZE && height <= h*BaseCommonUtil.VIDEO_IMG_SIZE){   //如果最小尺寸大于图片原始的宽度和高度---使用原始尺寸newW = width;newH = height;}else{newW = (int) (width* BaseCommonUtil.VIDEO_IMG_SIZE);  //缩放比例newH = (int) (height * BaseCommonUtil.VIDEO_IMG_SIZE);}	 }double ratio = 0; //缩放比例     //计算比例   if ((height > newH) || (width > newW)) {   if (height > width) {   ratio = (new Integer(newH)).doubleValue() / height;   } else {   ratio = (new Integer(newW)).doubleValue() / width;   }      }   AffineTransform transform = AffineTransform.getScaleInstance(ratio, ratio);// 返回表示缩放变换的变换AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);dstImage = op.filter(srcImg, null);ImageIO.write(dstImage, "PNG", new File(toPath)); }} catch (Exception e) {logger.error("【 " + filePath + "】图片缩放失败!");}  finally {}}/**  * 描述:将图片转换为其他格式* @param filePath 图片的路径  * @param newImagePath 新图片的路径 * @throws MagickException  */ public static boolean converToOther(String filePath,String newImagePath) throws MagickException, FileNotFoundException {MagickImage image = null;MagickImage scaleImg = null;FileInputStream f = null;boolean boo = false; //转换失败try {if(CacConver.exitFile(filePath)){f = new FileInputStream (filePath);//创建imageInfo对象  //数组的大小和文件的大小一致  byte[] b = new byte[f.available()];   f.read(b);  ImageInfo imageInfo = new ImageInfo();String imgType =newImagePath.substring(newImagePath.lastIndexOf(".")+1,newImagePath.length());imageInfo.setMagick(imgType);  imageInfo.setCompression(CompressionType.ZipCompression); //设置压缩   //读取imageInfo   image = new MagickImage(imageInfo,b);//设置新图片的路径  image.setFileName(newImagePath); //判断目录是否存在,不存在就创建BaseCommonUtil.mkdir(newImagePath);//执行  image.writeImage(imageInfo); String newGifImagePath = "";//如果是gif格式的图片需改名if("GIF".equals(filePath.substring(filePath.lastIndexOf(".")+1,filePath.length()).toUpperCase())){newGifImagePath  = newImagePath.substring(0,newImagePath.lastIndexOf("."))+"-0."+imgType;System.out.println(newGifImagePath);File newFile = new File(newGifImagePath);if(newFile.exists()){newFile.renameTo(new File(newImagePath));}}boo= true;logger.info("【 " + filePath + "】图片转换成功!");}} catch (MagickException e) {logger.error("【 " + filePath + "】图片转换失败!");} catch (FileNotFoundException e) {logger.error("【 " + filePath + "】图片不存在!");} catch (IOException e) {logger.error("【 " + filePath + "】图片转换失败!");}   finally {if (scaleImg != null) {scaleImg.destroyImages();}if(f != null){try {f.close();} catch (IOException e) {}}}return boo;}  /* 给图片添加文字水印  * @param pressText 水印文字  * @param filePath 源图像地址  * @param destImageFile 目标图像地址  * @param fontName 水印的字体名称  * @param fontStyle 水印的字体样式  * @param color 水印的字体颜色  * @param fontSize 水印的字体大小  * @param x 修正值  * @param y 修正值  * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字  */  public  static void pressText(String pressText,String filePath, String destImageFile, String fontName,  int fontStyle, Color color, int fontSize,int x,  int y, String alpha) throws MagickException  {  try {  if(CacConver.exitFile(filePath)){File img = new File(filePath);  Image src = ImageIO.read(img);  int width = src.getWidth(null);  int height = src.getHeight(null);  BufferedImage image = new BufferedImage(width, height,  BufferedImage.TYPE_INT_RGB);  Graphics2D g = image.createGraphics();  g.drawImage(src, 0, 0, width, height, null);  g.setColor(color);  g.setFont(new Font(fontName, fontStyle, fontSize));  g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,  Float.parseFloat(alpha)));  // 在指定坐标绘制水印文字   rotateImageg.drawString(pressText, (width - (pressText.length() * fontSize))/ 2 + x, (height - fontSize) /2 + y);  g.dispose();  ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 输出到文件流   }} catch (Exception e) {  logger.error("给【 " + filePath + "】图片添加文字水印失败!");}  }  /*** 给图片添加图片水印、可设置水印的旋转角度* @param filePath  原图片地址* @param newPath  新图片地址* @param logoPath  水印图片地址* @param degree 旋转的度数(-180到180的整数)* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字*/ public static void rotateImage(String filePath,String newPath,String logoPath,int degree,String alpha){  OutputStream os = null;try{if(CacConver.exitFile(filePath)){Image srcImg = ImageIO.read(new File(filePath));BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null),BufferedImage.TYPE_INT_RGB);//得到画笔对象Graphics2D g = buffImg.createGraphics();//设置对线段锯齿状边缘处理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,null);//设置水印图片旋转g.rotate(Math.toRadians(degree),(double)0,(double)0);//水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度ImageIcon imgIcon = new ImageIcon(logoPath);//得到Image对象Image img = imgIcon.getImage();//原图片的宽高int width = srcImg.getWidth(null);  int height = srcImg.getHeight(null);  //原图片的宽高int width1 = img.getWidth(null);  int height1 = img.getHeight(null); //透明度if(alpha == null || alpha.equals("")){alpha = "1";}g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, Float.parseFloat(alpha)));//System.out.println("width:" + width + "  --width1:" + width1 + "---height:" + height +"--height1:" + height1);//表示水印图片的位置g.drawImage(img,(width-width1)/2, (height-height1)/2,width1,height1,null);//				g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g.dispose();os = new FileOutputStream(newPath);//生成图片ImageIO.write(buffImg, "JPG", os);}}catch(Exception e){logger.error("给【 " + filePath + "】图片添加旋转图片水印失败!");}finally{try{if(null!=os){os.close();}}catch(Exception e){logger.error("给【 " + filePath + "】图片添加旋转图片水印失败!");}}}  /*** 根据文字生成图片* @param txt String  文字* @param fontSize   每个字的宽度和高度是一样的* @param fontColor Color  字体颜色* @param isBold 字体是否加粗* @param fontType  字体样式* @param fontPath  字体文件* @param tarImgPath  生成后的图片路径* @return*/public static void createJpgByFont(String txt, int fontSize,Color fontColor,boolean isBold,String fontType,String fontPath,String tarImgPath) {FileOutputStream out = null;try {           //如果文字不为空if(StringUtils.isNotEmpty(txt)){//==========设置默认字体样式/是否加粗/大小====//大小int defaultFontSize = 20;if(fontSize == 0){fontSize = defaultFontSize;}//字体样式Font font = null;if(fontType == null  || "".equals(fontType)){fontType = "宋体"; }//	            BufferedImage bimage = GraphicsEnvironment.getLocalGraphicsEnvironment().         
//	            		getDefaultScreenDevice().getDefaultConfiguration().//宽度   高度
//	            		createCompatibleImage(getLength(txt)*fontSize+fontSize,fontSize+10, Transparency.TRANSLUCENT);//宽度    高度  int imageLength = 0;if(getLength(txt)<10){imageLength = getLength(txt)*fontSize+fontSize;}else{if(fontSize == 20){imageLength = getLength(txt)*fontSize+fontSize+15;}else if(fontSize == 40){imageLength = getLength(txt)*fontSize+fontSize+25;}else{imageLength = getLength(txt)*fontSize+fontSize+35;}}BufferedImage bimage = new BufferedImage(imageLength,fontSize+10, Transparency.TRANSLUCENT);  Graphics2D g = bimage.createGraphics();//去除锯齿(当设置的字体过大的时候,会出现锯齿)g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(fontColor); //字的颜色//设置水印字体File file = new File(fontPath);  //如果是选择的字体文件if(file.exists()){font = Font.createFont(Font.TRUETYPE_FONT, file); //根据字体文件所在位置,创建新的字体对象(此语句在jdk1.5下面才支持)g.setFont(font.deriveFont((float) fontSize));   //font.deriveFont(float f)复制当前 Font 对象并应用新设置字体的大小g.setFont(font);}else{//是否加粗if(isBold){g.setFont(new Font(fontType, Font.BOLD, fontSize)); }else{g.setFont(new Font(fontType, Font.PLAIN, fontSize)); }}g.drawString(txt,0,fontSize); //在指定坐标除添加文字g.dispose();//如果父目录不存在就创建一个CacConver.replaceFliePathStr(tarImgPath);BaseCommonUtil.mkdir(tarImgPath);  //tarImgPathImageIO.write((BufferedImage) bimage, "PNG",new File(tarImgPath));  }} catch (Exception e) {logger.error("文字【" + txt + "】创建【 " + tarImgPath + "】水印图片文件失败!" + e.getStackTrace());} finally { try { if (null != out) out.close(); } catch (Exception e) { logger.error("文字【" + txt + "】创建【 " + tarImgPath + "】水印图片文件失败!"+ e.getStackTrace());}} }/*** 将多个小图片合成一张大jpg图  (小的jpg图片按照行列顺序平铺)* @param smallJPG ArrayList 一组小的jpg图片* @param bigWidth int 大图宽度* @param smallWidth int  单个文字生成的小图的宽度和高度是一致的* @param tarImgPath 目标文件* @return */@SuppressWarnings({ "rawtypes", "unused" })private void createBigJPG(ArrayList smallJPG, int bigWidth,int smallWidth,Color bgColor ,String tarImgPath) {FileOutputStream out = null;try {if (bigWidth < smallWidth) //如果大图片的高度比小图片的高度还小 直接返回return;int colCount = bigWidth / smallWidth; //每行放置的字数int leftMargin = (int) ((bigWidth - colCount * smallWidth) / 2f); //左边距int rowCount = smallJPG.size();  //小图行数 int setWidth = bigWidth; //每列中间不留空隙,只留左右边距int setHeight = smallWidth * rowCount ; //按照大图片宽高绘制一个背景图片BufferedImage bufImage = new BufferedImage(setWidth, setHeight,BufferedImage.TYPE_INT_RGB);Graphics2D g = bufImage.createGraphics();g.setColor(bgColor); //背景的颜色g.fillRect(0, 0, setWidth, setHeight);int y = 0; //纵坐标for (int i = 0; i < rowCount; i++) { //遍历每行ArrayList col = (ArrayList) (smallJPG.get(i));int x = leftMargin; //横坐标  可能会出现左边距for (int j = 0; j < col.size(); j++) {String jpgname = (String) (col.get(j));ImageIcon icon = new ImageIcon(jpgname);Image img = icon.getImage();int imgWidth = img.getHeight(null);g.drawImage(img, x, y, null);x += imgWidth;}y += (smallWidth);  }g.dispose();out = new FileOutputStream(tarImgPath);  //指定输出文件JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  //设置文件格式JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufImage); //从图片缓冲中读取param.setQuality(50f, true);encoder.encode(bufImage, param); //存盘out.flush();} catch (Exception e) {logger.error("创建【 " + tarImgPath + "】图片文件失败!");} finally { try { if (null != out) out.close(); } catch (Exception e) { logger.error("创建【 " + tarImgPath + "】图片文件失败!");}} }/** * 彩色转为黑白* @param srcPath* @param tarPath*/public static void gray(String srcPath, String tarPath){try{BufferedImage src = ImageIO.read(new File(srcPath));ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);ColorConvertOp op = new ColorConvertOp(cs, null);src = op.filter(src, null);ImageIO.write(src, "JPEG", new File(tarPath));}catch (IOException e){logger.error(" 转【 " + srcPath + "】彩色为黑白失败!");}}/*** 给图片添加文字水印、可设置水印的旋转角度* @param logoText 水印文字* @param srcImgPath  图片路径* @param targerPath  生成后的图片路径* @param degree 旋转的度数(-180到180的整数)* @param fontSize 字体大小* @param color 字体颜色* @param fontType 字体类型* @param isBold 字体是否加粗* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字*/ public static void imgMarkByText(String logoText, String filePath, String targerPath, int degree,int fontSize,Color color,String fontType,boolean isBold,String alpha) { // 主图片的路径 InputStream is = null; OutputStream os = null; try { if(CacConver.exitFile(filePath)){Image srcImg = ImageIO.read(new File(filePath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 得到画笔对象 Graphics2D g = buffImg.createGraphics(); // 设置对线段的锯齿状边缘处理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); int width=srcImg.getWidth(null);int height=srcImg.getHeight(null);g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); //======默认透明度=====================if(alpha == null  || "".equals(alpha)){alpha = "1";}//==================================g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,  Float.parseFloat(alpha)));  //==========设置默认字体样式/是否加粗/大小====//大小int defaultFontSize = 20;if(fontSize == 0){fontSize = defaultFontSize;}//字体样式if(fontType == null  || "".equals(fontType)){fontType = "宋体"; }//是否加粗if(isBold){g.setFont(new Font(fontType, Font.BOLD, fontSize)); }else{g.setFont(new Font(fontType, Font.PLAIN, fontSize)); }//=================================// 设置水印旋转 int xValue = 0; //设置起点坐标的x轴的数值int yValue = 0; //设置起点坐标的y轴的数值int xtValue = 0; //设置水印起点坐标的x轴的数值int ytValue = 0; //设置水印起点坐标的y轴的数值//  int widthTxt = fontSize * getTxtLength(logoText);  //文字的长度int wmWidth = getWatermarkLength(logoText, g); //文字的长度int hypotenuseLen = (int)Math.sqrt(width * width + height * height); //图片斜边的长度// System.out.println(hypotenuseLen +"------" + width + "-------"+ widthTxt + "-----------" +wmWidth + "-----" +height  );if(degree>=-90 && degree<=90){xValue =  width/2;yValue = height/2;xtValue = (hypotenuseLen-wmWidth)/4;ytValue = height/2;}else if(degree ==0){xValue =  width/2;yValue = height/2;xtValue = (width-wmWidth)/4;ytValue = height/2;}else if(degree ==-270){xValue =  width/2;yValue = height/2;xtValue =  (height-wmWidth)/2;ytValue = height/2;}else{logger.error("角度不对");}g.rotate(Math.toRadians(degree), (double)xValue,yValue); //==========设置默认颜色===============if(color== null){g.setColor(Color.BLACK); }else{g.setColor(color); }//=================================AffineTransform at = new AffineTransform();//使用一个translation变换为要旋转的文本设置空间at.setToTranslation(xtValue, ytValue);g.transform(at);g.drawString(logoText, 0.0f , 0.0f);g.dispose(); os = new FileOutputStream(targerPath); // 生成图片 ImageIO.write(buffImg, "JPG", os); srcImg.flush();buffImg.flush();logger.info("【 " + filePath + "】图片添加文字水印成功!");}} catch (Exception e) { logger.error("给【 " + filePath + "】图片添加文字水印失败!");} finally { try { if (null != is) is.close(); } catch (Exception e) { } try { if (null != os) os.close(); } catch (Exception e) { } } } /*** 给图片添加水印、可设置水印的旋转角度,并调整大小* @param logoText 水印文字* @param srcImgPath  图片路径* @param targerPath  生成后的图片路径* @param degree 旋转的度数(-180到180的整数)* @param fontSize 字体大小* @param color 字体颜色* @param fontType 字体类型* @param isBold 字体是否加粗* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字* @param width 图片宽度* @param height 图片高度*/ public static void createNewImgByMark(String logoText, String srcImgPath, String targerPath, int degree,int fontSize,Color color,String fontType,boolean isBold,String alpha,int width,int height) { degree = getWmDegreeOld(degree); //旋转水印计算度数,其他不需要添加if(CacConver.exitFile(srcImgPath)){if(width <=0 && height <= 0){imgMarkByText(logoText, srcImgPath, targerPath, degree, fontSize, color, fontType, isBold, alpha);}else {try {zoomImg(srcImgPath, targerPath, width, height);if(StringUtils.isNotEmpty(targerPath))imgMarkByText(logoText, targerPath, targerPath, degree, fontSize, color, fontType, isBold, alpha);} catch (FileNotFoundException e) {}}}} /*** 添加图片水印---指定图片水印的4个位子(0,1,2,3,4,5)* @param wmImg  //水印文件路径  * @param srcImg   //原文件路径* @param targetImg   //新文件路径* @param position  //位子(0,1,2,3,4,5)* 0:左上角* 1:右上角* 2:左下角* 3:右下角* 4:居中* @param alpha //透明度* @param width 图片宽度* @param height 图片高度*/public static void createNewImgByImg(String wmImg, String srcPath,String targetPath, int position, float alpha,int width,int height) { if(CacConver.exitFile(srcPath) && CacConver.exitFile(wmImg)){if(width <=0 && height <= 0){pressImaPosition(wmImg, srcPath, targetPath, position, alpha);}else {try {zoomImg(srcPath, targetPath, width, height);if(StringUtils.isNotEmpty(targetPath))pressImaPosition(wmImg, targetPath, targetPath, position, alpha);} catch (FileNotFoundException e) {}}}} /*** 添加图片水印---指定图片水印的4个位子(0,1,2,3,4,5)* @param wmImg  //水印文件路径  * @param srcImg   //原文件路径* @param targetImg   //新文件路径* @param position  //位子(0,1,2,3,4,5)* 0:左上角* 1:右上角* 2:左下角* 3:右下角* 4:居中* 5:平铺* @param alpha //透明度*/public final static void pressImaPosition(String wmImg, String srcPath,String targetPath, int position, float alpha) {  try {  srcPath = CacConver.replaceFliePathStr(srcPath).replaceAll("//", "/");targetPath = CacConver.replaceFliePathStr(targetPath).replaceAll("//", "/");File img = null;File targetImg = new File(targetPath); if(!srcPath.equals(targetPath)){img = new File(srcPath);  FileUtil.copyFile(img, targetImg);}Image src = ImageIO.read(targetImg);  int wideth = src.getWidth(null);  int height = src.getHeight(null);  BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);  Graphics2D g = image.createGraphics();  g.drawImage(src, 0, 0, wideth, height, null);  //水印文件  Image src_biao = ImageIO.read(new File(wmImg));  int wideth_biao = src_biao.getWidth(null);  int height_biao = src_biao.getHeight(null);  g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//左下角距离边距10像素int leftDownWideth = 10;int leftDownHeight = (height - height_biao) - 10;//右下角距离边距10像素int rightDownWideth = (wideth - wideth_biao) - 10;int rightDownHeight = (height - height_biao) - 10;//左上角距离边距10像素int leftUpWideth = 10;int leftUpHeight = 10;//右上角距离边距10像素int rightUpWideth = (wideth - wideth_biao) - 10;int rightUpHeight = 10;int x = 0;int y = 0;switch (position) {case 0:x = leftUpWideth;y = leftUpHeight;g.drawImage(src_biao, x, y , wideth_biao, height_biao, null);  break;case 1:x = rightUpWideth;y = rightUpHeight;g.drawImage(src_biao, x, y , wideth_biao, height_biao, null);  break;case 2:x = leftDownWideth;y = leftDownHeight;g.drawImage(src_biao, x, y , wideth_biao, height_biao, null);  break;case 3:x = rightDownWideth;y = rightDownHeight;g.drawImage(src_biao, x, y , wideth_biao, height_biao, null);  break;case 4:g.drawImage(src_biao, (wideth - wideth_biao) / 2, (height - height_biao) / 2, wideth_biao, height_biao, null);break;case 5:// 横向平铺水印for (int imageX = 0; imageX < wideth; imageX += wideth_biao) {int drawRow = 0;// 纵向平铺水印for (int imageY = drawRow * height_biao; imageY < height; imageY += height_biao) {g.drawImage(src_biao, imageX, imageY, wideth_biao, height_biao, null);drawRow++;}}break;default:break;}//水印文件结束g.dispose();  ImageIO.write((BufferedImage) image, "JPG", targetImg);  } catch (Exception e) {  logger.error("给【 " + srcPath + "】添加图片水印失败!");}  }  /*** 图片加文字文字(五个位置,分别是图片的左上角,右上角,中间,左下角,右下角)对应参数 int weizhi 可以取0到4)* @param pressText  //水印文字* @param srcPath  //原图片路径* @param targetPath  //新图片路径* @param position  //位子* 0:左上角* 1:右上角* 2:左下角* 3:右下角* 4:居中* @param fontSize  //字体大小* @param color  //字体颜色* @param fontName  //字体* @param isBold 字体是否加粗* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字*/public static void pressImgText(String pressText, String srcPath, String targetPath, int position, int fontSize, Color color, String fontName,boolean isBold, String alpha) {  try {  srcPath = CacConver.replaceFliePathStr(srcPath).replaceAll("//", "/");targetPath = CacConver.replaceFliePathStr(targetPath).replaceAll("//", "/");File img = null;File targetImg = new File(targetPath); if(!srcPath.equals(targetPath)){img = new File(srcPath);  FileUtil.copyFile(img, targetImg);}Image src = ImageIO.read(targetImg);  int width = src.getWidth(null);  int height = src.getHeight(null);  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  Graphics2D g = image.createGraphics();  g.drawImage(src, 0, 0, width, height, null);  //==========设置默认字体样式/颜色/是否加粗/大小====if(color== null){g.setColor(Color.BLACK); }else{g.setColor(color); }//大小int defaultFontSize = 20;if(fontSize == 0){fontSize = defaultFontSize;}//字体样式if(fontName == null  || "".equals(fontName)){fontName = "宋体"; }//是否加粗if(isBold){g.setFont(new Font(fontName, Font.BOLD, fontSize)); }else{g.setFont(new Font(fontName, Font.PLAIN, fontSize)); }//设置默认的透明度if(StringUtils.isEmpty(alpha) || alpha.equals("0")){alpha ="0.5";}g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, Float.parseFloat(alpha)));// 左上角int leftUpWideth = 10;int leftUpHeight = fontSize+10;// 右上角int rightUpWideth = (width - (getLength(pressText) * fontSize)) - 30;int rightUpHeight = fontSize+10;//左下角int leftDownWideth = 10;int leftDownHeight = height - fontSize;//右下角int rightDownWideth = (width - (getLength(pressText) * fontSize)) - 30;int rightDownHeight = height - fontSize;int x = 0;int y = 0;switch (position) {case 0:x = leftUpWideth;y = leftUpHeight;g.drawString(pressText, x, y);break;case 1:x = rightUpWideth;y = rightUpHeight;g.drawString(pressText, x, y);break;case 2:x = leftDownWideth;y = leftDownHeight;g.drawString(pressText, x, y);break; case 3:x = rightDownWideth;y = rightDownHeight;g.drawString(pressText, x, y);break;case 4:g.drawString(pressText, width / 2 - 2 * fontSize, height / 2);break;default:break;}g.dispose();  ImageIO.write((BufferedImage) image, "JPG", targetImg);  } catch (Exception e) {  logger.error("给【 " + srcPath + "】添加文字水印失败!");}  }/*** 通过  ImageMagick 的 convert 转换成实现psd文件转换成其他图片* @param srcImagePath psd文件(原)* @param tarImagePath 转换后的新图片(新)* 说明:* -resize \"1024x768>\"  定义转换后的尺寸大小* -layers flatten 合并图层* @return*/public static boolean processImage2Other(String srcImagePath,String tarImagePath) {  boolean boo= true;if (!BaseCommonUtil.checkfile(srcImagePath)) {  logger.error("【" + srcImagePath + "】  不存在 !"); return false;  }  Process process = null;  try {if(StringUtils.isNotEmpty(imgConverPath)){process = Runtime.getRuntime().exec(BaseCommonUtil.getChRealPath(imgConverPath) + "  -layers flatten "   + srcImagePath + " "+ tarImagePath);display(process);if(process != null){process.destroy();}}} catch (IOException e) {boo = false;logger.error("转换【 " + srcImagePath + "】psd文件失败!");} return boo;}  /*** 等待处理的进程* @param process* @throws IOException*/private static void display (Process process) throws IOException{  String s;  BufferedReader bufferedReader = new BufferedReader(  new InputStreamReader(process.getInputStream()));  while ((s = bufferedReader.readLine()) != null){logger.debug(s);  }}  /*** 取得汉字的长度* @param text* @return*/public static int getLength(String text) {  int length = 0;  for (int i = 0; i < text.length(); i++) {  if (new String(text.charAt(i) + "").getBytes().length > 1) {  length += 2;  } else {  length += 1;  }  }  return length / 2;  }  //获取水印文字总长度private static int getWatermarkLength(String str, Graphics2D g) {if(StringUtils.isNotEmpty(str)){return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0, str.length());}else {return 0;}}/*** @param fontSizeType 通过水印类型来设置水印字体大小* 01:大* 02:中* 03:小* @return*/public static int getFontSize(int fontSizeType){int fontSize = 0;if(fontSizeType == 01){fontSize = 60;}else if(fontSizeType == 02){fontSize = 40;}else if(fontSizeType == 03){fontSize = 20;}return fontSize;}/*** @param fontSizeType 通过水印方位来设置水印的角度* 01:左上角* 02:左下角* 03 : 右上角* 04:右下角* @return*/public static int getWmDegreeOld(int wmPosition){wmPosition = wmPosition + 1;int wmDegree = -45;  //默认为-45度角if(wmPosition == 01){wmDegree = 45;}else if(wmPosition == 02){wmDegree = -45;}else if(wmPosition == 03){wmDegree = 0;}else if(wmPosition == 04){wmDegree = -270;}return wmDegree;} public static void main(String[] agrs) throws MagickException{
//    	  processImage2Other("D:/Project素材/image/aaa1.psd","D:/Project素材/image/aaaaa.png");
//    	  converToOther("D:/Project素材/image/5.tif","D:/Project素材/image/11111.jpg");
//    	  jpgTotif("D:/Project素材/image/22222.bmp","D:/Project素材/image/5.tif");
//    	  String inputFile  =  "D:/Project素材/image/5.tif";
//    	  String outputFile = "D:/Project素材/image/1111.bmp";
//    	  tifToBmp(inputFile,outputFile);//    	  rotateImage("D:/Project素材/image/1.jpg", "D:/Project素材/image/2.jpg", "D:/Project素材/image/11.jpg", 30, "1");
//    	  initLogoImg("D:/Project素材/image/1.jpg", "D:/Project素材/image/2.jpg", "D:/Project素材/image/11.jpg");
//    	  pressImage("D:/Project素材/image/111111.jpg",  "D:/Project素材/image/2.jpg", 800,600,1f);
//    	  pressImagePosition("D:/Project素材/image/111111.jpg",  "D:/Project素材/image/2.jpg","D:/Project素材/image/6.jpg",2,0.3f);
//    	  pressImage("D:/Project素材/image/111111.jpg",  "D:/Project素材/image/6.jpg", 2);
//			zoomImg("D:/Project素材/image/1.jpg", "D:/Project素材/image/111111.jpg",500, 100);
//     	    zoomSureImg("D:/Project素材/image/你好.JPG", "D:/Project素材/image/3333333.jpg");
//     	 converToOther("D:\\old\\4.gif", "D:\\byyxproject\\test\\new\\1000.jpg");
//    	  System.out.println(getImgInfo("D:\\9.mp4"));
//    	  ImgYin("测试测试测试哈哈","E:/11.jpg");
//    	  pressImage("E:/3.jpg","E:/11.jpg",100,18,0.5f);
//    	  pressText("测试test.zz","E:/11.jpg","宋体",Font.BOLD,Color.red,20,20,20,1.0f);
//    	  pressImgText("我是水印字", "D:/Project素材/image/2.jpg","D:/Project素材/image/6.jpg",4,150,Color.blue,"宋体",true,"");
//    	  createNewImgByMark("我是水印字", "D:/Project素材/image/3.jpg","D:/Project素材/image/6.jpg",3,20,Color.blue,"宋体",true,"",0,0);
//   	  createJpgByFont("http://www.dajia.com.cn.jkrtrtppnn",60,Color.blue,true,"宋体","","E:/89.png");}}


这篇关于java 图片转换、加水印等工具类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/806207

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu