ImageMagick

在做pdf文档转成jpg的时候,发现了Jmagick的创建高质量的图片的一个java类库,自己以前使用另外的一个类库,感觉这个更好点,就试着用了下,感觉不错

1.使用的windows下的jmagick-win-6.3.9-Q16.zip 地址是:http://downloads.jmagick.org/6.3.9/

2.doc对应的api地址:http://downloads.jmagick.org/jmagick-doc/

3.安装ImageMagick,官方网站:http://www.imagemagick.org/

我使用的是:ImageMagick-6.4.6-4-Q16-windows-dll.exe :点击下载

4. 安装ImageMagick-6.4.6-4-Q16-windows-dll.exe,将 安装目录下(按自己所安装的目录找) 下的所有dll文件 copy 到系统盘下的 “C:\WINDOWS\system32\”文件夹里

5. 配置环境变量
再环境变量path里添加新的值 “C:\Program Files\ImageMagick-6.4.6-4-Q16“使用IDE可以不用配置

6.解压jmagick-win-6.3.9-Q16.zip
将 jmagick.dll 复制到系统盘下的 “C:\WINDOWS\system32\”文件夹里 和 复制到jdk的bin(例“D:\jdk6\bin”)文件里各一份
将 jmagick.jar 复制到Tomcat下的lib文件夹里 和 所使用项目的WEB-INF下lib文件里 各一份

7.web应用如果部署到tomcat下,那么最好在catalina.bat文件中改变如下设置
set JAVA_OPTS=%JAVA_OPTS% -Xms256M -Xmx768M -XX:MaxPermSize=128M – Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager – Djava.util.logging.config.file=”${catalina.base}\conf\logging.properties”
避免heap溢出的问题,参数看你自己的机器而定。( -Xms256M -Xmx768M -XX:MaxPermSize=128M )

8.还要注意如果部署到web应用,你在使用的class里面需要
System.setProperty(“jmagick.systemclassloader”,”no”);
要不然会报出UnsatisfiedLinkError: no JMagick in java.library.path.
实例测试code:

常用的水印,切图,压缩等简单程序工具类,继续下面

[java]  view plain copy
  1. package com.utils;    
  2.       
  3. import magick.ImageInfo;    
  4. import magick.MagickApiException;    
  5. import magick.MagickException;    
  6. import magick.MagickImage;    
  7.       
  8. public class Treamspdf {  
  9.  public static void main(String[] args) {  
  10. resetsize("E:/mylearn/workspace/TTPDF/src/com/utils/http_imgload.jpg","new.jpg");    
  11. }  
  12.     public static void resetsize(String picFrom,String picTo){  
  13.         try{  
  14.             ImageInfo info=new ImageInfo(picFrom);    
  15.             MagickImage image=new MagickImage(new ImageInfo(picFrom));    
  16.             MagickImage scaled=image.scaleImage(12097);    
  17.             scaled.setFileName(picTo);    
  18.             scaled.writeImage(info);    
  19.         }catch(MagickApiException ex){  
  20.             ex.printStackTrace();    
  21.         } catch(MagickException ex){  
  22.             ex.printStackTrace();    
  23.         }  
  24.     }  
  25. }  


常用的水印,切图,压缩等简单程序工具类,继续下面

[java]  view plain copy
  1. package com.utils;       
  2.       
  3. import java.awt.Dimension;    
  4. import java.awt.Rectangle;    
  5. import java.text.SimpleDateFormat;    
  6. import java.util.Date;       
  7.       
  8. import magick.CompositeOperator;    
  9. import magick.CompressionType;    
  10. import magick.DrawInfo;    
  11. import magick.ImageInfo;    
  12. import magick.MagickException;    
  13. import magick.MagickImage;    
  14. import magick.PixelPacket;    
  15. import magick.PreviewType;       
  16.       
  17. public class Aa {       
  18.       
  19.     static{    
  20.         //不能漏掉这个,不然jmagick.jar的路径找不到    
  21.         System.setProperty("jmagick.sys  
  22.         temclassloader","no");    
  23.     }       
  24.       
  25.     /**  
  26.      * 压缩图片  
  27.      * @param filePath 源文件路径  
  28.      * @param toPath   缩略图路径  
  29.      */   
  30.     public static void createThumbnail(String filePath,   
  31.         String toPath) throws MagickException{    
  32.         ImageInfo info = null;    
  33.         MagickImage image = null;    
  34.         Dimension imageDim = null;    
  35.         MagickImage scaled = null;    
  36.         try{    
  37.             info = new ImageInfo(filePath);    
  38.             image = new MagickImage(info);    
  39.             imageDim = image.getDimension();    
  40.             int wideth = imageDim.width;    
  41.             int height = imageDim.height;    
  42.             if (wideth > height) {    
  43.                 height = 660 * height / wideth;    
  44.                 wideth = 660;    
  45.             }    
  46.             scaled = image.scaleImage(wideth, height);//小图片文件的大小.    
  47.             scaled.setFileName(toPath);    
  48.             scaled.writeImage(info);    
  49.         }finally{    
  50.             if(scaled != null){    
  51.                 scaled.destroyImages();    
  52.             }    
  53.         }    
  54.     }       
  55.       
  56.     /**  
  57.      * 水印(图片logo)  
  58.      * @param filePath  源文件路径  
  59.      * @param toImg     修改图路径  
  60.      * @param logoPath  logo图路径  
  61.      * @throws MagickException  
  62.      */   
  63.     public static void initLogoImg(String filePath, String toImg,  
  64.         String logoPath) throws MagickException {    
  65.         ImageInfo info = new ImageInfo();    
  66.         MagickImage fImage = null;    
  67.         MagickImage sImage = null;    
  68.         MagickImage fLogo = null;    
  69.         MagickImage sLogo = null;    
  70.         Dimension imageDim = null;    
  71.         Dimension logoDim = null;    
  72.         try {    
  73.             fImage = new MagickImage(new ImageInfo(filePath));    
  74.             imageDim = fImage.getDimension();    
  75.             int width = imageDim.width;    
  76.             int height = imageDim.height;    
  77.             if (width > 660) {    
  78.                 height = 660 * height / width;    
  79.                 width = 660;    
  80.             }    
  81.             sImage = fImage.scaleImage(width, height);       
  82.       
  83.             fLogo = new MagickImage(new ImageInfo(logoPath));    
  84.             logoDim = fLogo.getDimension();    
  85.             int lw = width / 8;    
  86.             int lh = logoDim.height * lw / logoDim.width;    
  87.             sLogo = fLogo.scaleImage(lw, lh);       
  88.       
  89.             sImage.compositeImage(CompositeOperator.AtopCompositeOp, sLogo,   
  90.                                   width-(lw + lh/10), height-(lh + lh/10));    
  91.             sImage.setFileName(toImg);    
  92.             sImage.writeImage(info);    
  93.         } finally {    
  94.             if(sImage != null){    
  95.                 sImage.destroyImages();    
  96.             }    
  97.         }    
  98.     }       
  99.       
  100.     /**  
  101.      * 水印(文字)  
  102.         * @param filePath 源文件路径  
  103.      * @param toImg    修改图路径  
  104.      * @param text     名字(文字内容自己随意)  
  105.      * @throws MagickException  
  106.      */   
  107.     public static void initTextToImg(String filePath, String toImg,  String text)   
  108.                                       throws MagickException{    
  109.             ImageInfo info = new ImageInfo(filePath);    
  110.             if (filePath.toUpperCase().endsWith("JPG")  
  111.                 ||filePath.toUpperCase().endsWith("JPEG")) {    
  112.                 info.setCompression(CompressionType.JPEGCompression); //压缩类别为JPEG格式    
  113.                //预览格式为JPEG格式    
  114.                 info.setPreviewType(PreviewType.JPEGPreview);   
  115.                 info.setQuality(95);    
  116.             }    
  117.             MagickImage aImage = new MagickImage(info);    
  118.             Dimension imageDim = aImage.getDimension();    
  119.             int wideth = imageDim.width;    
  120.             int height = imageDim.height;    
  121.             if (wideth > 660) {    
  122.                 height = 660 * height / wideth;    
  123.                 wideth = 660;    
  124.             }    
  125.             int a = 0;    
  126.             int b = 0;    
  127.             String[] as = text.split("");    
  128.             for (String string : as) {    
  129.                 if(string.matches("[\u4E00-\u9FA5]")){    
  130.                     a++;    
  131.                 }    
  132.                 if(string.matches("[a-zA-Z0-9]")){    
  133.                     b++;    
  134.                 }    
  135.             }    
  136.             int tl = a*12 + b*6 + 300;    
  137.             MagickImage scaled = aImage.scaleImage(wideth, height);    
  138.             if(wideth > tl && height > 5){    
  139.                 DrawInfo aInfo = new DrawInfo(info);    
  140.                 aInfo.setFill(PixelPacket.queryColorDatabase("white"));    
  141.                 aInfo.setUnderColor(new PixelPacket(0,0,0,100));    
  142.                 aInfo.setPointsize(12);    
  143.                 //解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑    
  144.                 String fontPath = "C:/WINDOWS/Fonts/MSYH.TTF";    
  145. //              String fontPath = "/usr/maindata/MSYH.TTF";    
  146.                 aInfo.setFont(fontPath);    
  147.                 aInfo.setTextAntialias(true);    
  148.                 aInfo.setOpacity(0);    
  149.                 aInfo.setGeometry("+" + (wideth-tl) + "+" + (height-5));    
  150.                 scaled.annotateImage(aInfo);    
  151.             }    
  152.             scaled.setFileName(toImg);    
  153.             scaled.writeImage(info);    
  154.             scaled.destroyImages();    
  155.     }       
  156.       
  157.     /**  
  158.      * 切图  
  159.      * @param imgPath 源图路径  
  160.      * @param toPath  修改图路径  
  161.      * @param w  
  162.      * @param h  
  163.      * @param x  
  164.      * @param y  
  165.      * @throws MagickException  
  166.      */   
  167.     public static void cutImg(String imgPath, String toPath, int w,   
  168.         int h, int x, int y) throws MagickException {    
  169.         ImageInfo infoS = null;    
  170.         MagickImage image = null;    
  171.         MagickImage cropped = null;    
  172.         Rectangle rect = null;    
  173.         try {    
  174.             infoS = new ImageInfo(imgPath);    
  175.             image = new MagickImage(infoS);    
  176.             rect = new Rectangle(x, y, w, h);    
  177.             cropped = image.cropImage(rect);    
  178.             cropped.setFileName(toPath);    
  179.             cropped.writeImage(infoS);       
  180.       
  181.         } finally {    
  182.             if (cropped != null) {    
  183.                 cropped.destroyImages();    
  184.             }    
  185.         }    
  186.     }    
  187. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值