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. }  
<think>嗯,用户需要一份关于ImageMagick的安装使用指南和常见问题解答。从用户提问的简洁程度看,可能是技术背景不深的新手,需要全面但易懂的指导。 用户上次的问题涉及Linux环境安装,这次应该延续这个场景。考虑到CentOS 7的官方源版本较旧,需要特别说明版本差异——6.x和7.x的参数兼容性在引用[1]里提到过,这点必须强调,因为这是实际使用时的关键陷阱。 安装部分要覆盖三种主流系统:Linux用yum和源码编译两种方案(后者针对需要新版本的用户),macOS用brew最方便,Windows则提供官方安装包。对于源码编译这种复杂操作,需要给出关键依赖库的安装命令,否则用户容易卡在configure步骤。 使用指南部分,用户最可能需要的是格式转换和尺寸调整这类基础操作。convert命令的参数说明要拆解清楚,比如-resize的百分比和像素值区别,-quality的数值范围。高级功能如GIF处理只需简单提及,避免信息过载。 常见问题设计成漏斗结构:先解决安装失败(依赖缺失/权限问题),再处理典型报错(权限拒绝/格式不支持),最后是版本兼容问题。特别加入"command not found"的解决方案,因为这是新手高频问题。 安全注意事项容易被忽略,但很重要。需要警告用户处理外部图片时用-sanitize参数,并说明临时目录权限设置。最后补充卸载方法算是贴心小细节。 引用[1]提到CentOS 7的版本问题,在FAQ里专门设为Q4,用加粗突出版本号差异。整个回答保持技术准确性的同时,把yum安装的旧版本警告放在安装步骤显眼位置,防止用户踩坑。</think>以下为ImageMagick的详细安装指南、核心功能使用及常见问题解决方案: --- ### **一、安装指南** #### **1. Linux (CentOS 7)** ```bash # 安装基础依赖 sudo yum install -y gcc openssl-devel libpng-devel libjpeg-devel # 方案1:yum安装(默认6.x版本) sudo yum install -y ImageMagick # 方案2:源码安装7.x(推荐) wget https://imagemagick.org/archive/ImageMagick-7.1.1-15.tar.gz tar xvzf ImageMagick-7.1.1-15.tar.gz cd ImageMagick-7.1.1-15 ./configure make sudo make install ``` #### **2. macOS (Homebrew)** ```bash brew install imagemagick ``` #### **3. Windows** - 官网下载安装包:[ImageMagick Windows Binaries](https://imagemagick.org/script/download.php) - 安装时勾选 **"Add application directory to your system path"** 以配置环境变量 #### **4. 验证安装** ```bash convert --version # 6.x版本命令 magick --version # 7.x版本命令 ``` --- ### **二、核心功能使用** #### **1. 格式转换** ```bash # 将JPG转PNG(6.x) convert input.jpg output.png # 7.x版本命令 magick input.jpg output.png ``` #### **2. 调整尺寸** ```bash # 缩放到50%宽度(保持比例) convert input.jpg -resize 50% output.jpg # 固定宽高(300x200,可能裁剪) convert input.jpg -resize 300x200^ -gravity center -extent 300x200 output.jpg ``` #### **3. 图片质量压缩** ```bash convert input.jpg -quality 80% output.jpg # 质量设为80% ``` #### **4. 创建GIF动图** ```bash convert -delay 100 frame1.jpg frame2.jpg frame3.jpg animation.gif # 每帧0.1秒 ``` #### **5. 去除EXIF信息** ```bash convert input.jpg -strip output.jpg ``` --- ### **三、常见问题解决** #### **Q1: 安装后命令未找到(command not found)** - **原因**:环境变量未配置 - **解决**: ```bash # Linux/macOS临时生效 export PATH="/usr/local/bin:$PATH" # 永久生效:将上行加入 ~/.bashrc 或 ~/.zshrc ``` #### **Q2: 权限拒绝(Permission denied)** - **原因**:临时目录访问限制 - **解决**: ```bash sudo chmod 777 /tmp # 临时方案(有安全风险) # 或指定专用缓存目录 convert -define registry:temporary-path=/home/user/tmp input.jpg output.jpg ``` #### **Q3: 不支持HEIC/WebP等格式** - **解决**:安装扩展解码器 ```bash # Linux sudo yum install libheif-devel webp-tools # macOS brew install libheif webp ``` #### **Q4: 版本兼容问题(6.x vs 7.x)** - **关键差异**: - 6.x:主命令 `convert` - 7.x:主命令 `magick`(支持旧命令别名) - **兼容方案**: 创建符号链接(7.x环境): ```bash ln -s /usr/local/bin/magick /usr/local/bin/convert ``` #### **Q5: 处理大图时内存不足** - **解决**:限制内存使用 ```bash convert -limit memory 2GB -limit map 4GB large_input.jpg output.png ``` --- ### **四、安全注意事项** 1. **处理用户上传图片时**: ```bash magick input.jpg -sanitize output.jpg # 清除潜在恶意脚本 ``` 2. **禁用高危功能**(如无必要): 编辑 `policy.xml`(路径:`/etc/ImageMagick-7/policy.xml`),例如: ```xml <policy domain="coder" rights="none" pattern="HTTPS" /> <!-- 禁止网络请求 --> <policy domain="resource" name="memory" value="256MiB"/> <!-- 限制内存 --> ``` --- ### **五、卸载方法** ```bash # 源码安装卸载 cd ImageMagick-7.1.1-15 sudo make uninstall # yum卸载 sudo yum remove ImageMagick # brew卸载 brew uninstall imagemagick ``` --- **相关问题** 1. 如何用ImageMagick批量处理文件夹内所有图片? 2. ImageMagick如何实现图片水印添加与位置控制? 3. 有哪些替代ImageMagick的开源图像处理工具? 4. 如何通过ImageMagick提取图片中的EXIF元数据? > 引用参考:ImageMagick官方安装文档及安全策略说明[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值