ImageMagick for java 使用Jmagick压缩高质量图片jmagick-win-6.3.9-Q16.zip
星期一, 2008-12-01 | Author: liyz | JAVA-and-J2EE | 21,422 views
在做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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.utils; import magick.ImageInfo; import magick.MagickApiException; import magick.MagickException; import magick.MagickImage; public class Treamspdf { public static void main(String[] args) { resetsize("E:/mylearn/workspace/TTPDF/src/com/utils/http_imgload.jpg","new.jpg"); } public static void resetsize(String picFrom,String picTo){ try{ ImageInfo info=new ImageInfo(picFrom); MagickImage image=new MagickImage(new ImageInfo(picFrom)); MagickImage scaled=image.scaleImage(120, 97); scaled.setFileName(picTo); scaled.writeImage(info); }catch(MagickApiException ex){ ex.printStackTrace(); } catch(MagickException ex) { ex.printStackTrace(); } } } |
常用的水印,切图,压缩等简单程序工具类,继续下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | package com.utils; import java.awt.Dimension; import java.awt.Rectangle; import java.text.SimpleDateFormat; import java.util.Date; import magick.CompositeOperator; import magick.CompressionType; import magick.DrawInfo; import magick.ImageInfo; import magick.MagickException; import magick.MagickImage; import magick.PixelPacket; import magick.PreviewType; public class Aa { static{ //不能漏掉这个,不然jmagick.jar的路径找不到 System.setProperty("jmagick.systemclassloader","no"); } /** * 压缩图片 * @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; try{ info = new ImageInfo(filePath); image = new MagickImage(info); imageDim = image.getDimension(); int wideth = imageDim.width; int height = imageDim.height; if (wideth > height) { height = 660 * height / wideth; wideth = 660; } scaled = image.scaleImage(wideth, height);//小图片文件的大小. scaled.setFileName(toPath); scaled.writeImage(info); }finally{ if(scaled != null){ scaled.destroyImages(); } } } /** * 水印(图片logo) * @param filePath 源文件路径 * @param toImg 修改图路径 * @param logoPath logo图路径 * @throws MagickException */ public static void initLogoImg(String filePath, String toImg, String logoPath) throws MagickException { ImageInfo info = new ImageInfo(); MagickImage fImage = null; MagickImage sImage = null; MagickImage fLogo = null; MagickImage sLogo = null; Dimension imageDim = null; Dimension logoDim = null; try { fImage = new MagickImage(new ImageInfo(filePath)); imageDim = fImage.getDimension(); int width = imageDim.width; int height = imageDim.height; if (width > 660) { height = 660 * height / width; width = 660; } sImage = fImage.scaleImage(width, height); fLogo = new MagickImage(new ImageInfo(logoPath)); logoDim = fLogo.getDimension(); int lw = width / 8; int lh = logoDim.height * lw / logoDim.width; sLogo = fLogo.scaleImage(lw, lh); sImage.compositeImage(CompositeOperator.AtopCompositeOp, sLogo, width-(lw + lh/10), height-(lh + lh/10)); sImage.setFileName(toImg); sImage.writeImage(info); } finally { if(sImage != null){ sImage.destroyImages(); } } } /** * 水印(文字) * @param filePath 源文件路径 * @param toImg 修改图路径 * @param text 名字(文字内容自己随意) * @throws MagickException */ public static void initTextToImg(String filePath, String toImg, String text) throws MagickException{ ImageInfo info = new ImageInfo(filePath); if (filePath.toUpperCase().endsWith("JPG") || filePath.toUpperCase().endsWith("JPEG")) { info.setCompression(CompressionType.JPEGCompression); //压缩类别为JPEG格式 info.setPreviewType(PreviewType.JPEGPreview); //预览格式为JPEG格式 info.setQuality(95); } MagickImage aImage = new MagickImage(info); 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); //解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑 String fontPath = "C:/WINDOWS/Fonts/MSYH.TTF"; // String fontPath = "/usr/maindata/MSYH.TTF"; aInfo.setFont(fontPath); aInfo.setTextAntialias(true); aInfo.setOpacity(0); aInfo.setText(" " + text + "于 " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 上传于XXXX网,版权归作者所有!"); aInfo.setGeometry("+" + (wideth-tl) + "+" + (height-5)); scaled.annotateImage(aInfo); } scaled.setFileName(toImg); scaled.writeImage(info); scaled.destroyImages(); } /** * 切图 * @param imgPath 源图路径 * @param toPath 修改图路径 * @param w * @param h * @param x * @param y * @throws MagickException */ public static void cutImg(String imgPath, String toPath, int w, int h, int x, int y) throws MagickException { ImageInfo infoS = null; MagickImage image = null; MagickImage cropped = null; Rectangle rect = null; try { infoS = new ImageInfo(imgPath); image = new MagickImage(infoS); rect = new Rectangle(x, y, w, h); cropped = image.cropImage(rect); cropped.setFileName(toPath); cropped.writeImage(infoS); } finally { if (cropped != null) { cropped.destroyImages(); } } } } |
文章作者: liyz
本文地址: https://www.pomelolee.com/142.html
除非注明,Pomelo Lee文章均为原创,转载请以链接形式标明本文地址
5 Comments to ImageMagick for java 使用Jmagick压缩高质量图片jmagick-win-6.3.9-Q16.zip
据说按照上面的布置,web程序还是会报错,大致错误是:
java.lang.NoClassDefFoundError: Could not initialize class magick.MagickImage
或者是magick.Magick.init错误。
解:发现还要把jmagick.jar复制到
2009 年 01 月 15 日
В практике управления традиционно считается, что цель почти всегда очевидна и усилия надо сосредоточивать на поисках средств и путей ее достижения.
2010 年 02 月 26 日
[…] 使用Jmagick压缩高质量图片 […]
2010 年 04 月 06 日
直接用exec调imagemagic的convert不行吗?
2012 年 10 月 29 日
这个用命令行的方式当然可以了
Leave a comment
Search
相关文章
热门文章
最新文章
文章分类
- ajax (10)
- algorithm-learn (3)
- Android (6)
- as (3)
- computer (85)
- Database (30)
- disucz (4)
- enterprise (1)
- erlang (2)
- flash (5)
- golang (3)
- html5 (18)
- ios (4)
- JAVA-and-J2EE (186)
- linux (143)
- mac (10)
- movie-music (11)
- pagemaker (36)
- php (50)
- spring-boot (2)
- Synology群晖 (2)
- Uncategorized (6)
- unity (1)
- webgame (15)
- wordpress (33)
- work-other (2)
- 低代码 (1)
- 体味生活 (40)
- 前端 (21)
- 大数据 (8)
- 游戏开发 (9)
- 爱上海 (19)
- 读书 (4)
- 软件 (3)
2008 年 12 月 01 日