http://www.open-open.com/lib/view/open1355754261963.html

做网站往往需要处理各种各样的图片,对于jdk自带的一套图片处理库,他的特点是稳定简单,但是对图片处理来说,性能确实很不咋的!

        于是我转向了以C++处理为核心的java处理包—— JMagick+ ImageMagick 。jmagick是一个开源的API,利用JNI(Java Native Interface)技术实现了对ImageMagickAPI
的Java访问接口,因此也将比纯Java实现的图片操作函数在速度上要快。实地测试后发现,速度果然提高了不少,但是质量却大大下降了,在大量测试数据下,每生成100张图片约会有5张图片生成出现错误,还会出现down机的情况。对于一个商业应用来说,这个是绝对不可以接受的,于是对jmagick的研究暂放一段时间。

        经过韩boss指导,我转向了 GraphicsMagick+im4java 的研究,输入关键词google一下,很容易就可以找到http://javantsky.iteye.com/blog/747807 ,这篇博客,文章介绍GraphicsMagick+im4java
性能高,运行稳定!

注意事项:如果是在windows下运行,则需要配置ImageMagick的安装路径: 

我是配置在config.properties文件里了,比如内容如下所示: 

imageMagickPath=C://Program Files//GraphicsMagick-1.3.14-Q16

如果是在linux平台下,则不需要配置。

  1. package imageUtils;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5.  
  6. import org.im4java.core.ConvertCmd;
  7. import org.im4java.core.IMOperation;
  8.  
  9. /**
  10. * @author hegh E-mail: heguanhua@tjhq.com
  11. * @version 创建时间:Mar 13, 2012 10:43:12 AM 类说明
  12. */
  13. public class ImageMagick {
  14.  
  15. /** * ImageMagick的路径 */
  16. public static String imageMagickPath = null;
  17. static{ /**获取ImageMagick的路径 */
  18. //Properties prop = new PropertiesFile().getPropertiesFile();
  19. //linux下不要设置此值,不然会报错
  20. //imageMagickPath = prop.getProperty("imageMagickPath");
  21. }
  22.  
  23. /** * 根据坐标裁剪图片
  24. * @param srcPath 要裁剪图片的路径
  25. * @param newPath 裁剪图片后的路径
  26. * @param x 起始横坐标
  27. * @param y 起始挫坐标
  28. * @param x1 结束横坐标
  29. * @param y1 结束挫坐标
  30. */
  31. public static void cutImage(String srcPath, String newPath, int x, int y, int x1, int y1)
  32. throws Exception {
  33. int width = x1 - x; int height = y1 - y;
  34. IMOperation op = new IMOperation();
  35. op.addImage(srcPath);
  36. /**
  37. * width:裁剪的宽度
  38. * height:裁剪的高度
  39. * x:裁剪的横坐标
  40. * y:裁剪的挫坐标
  41. */
  42. op.crop(width, height, x, y);
  43. op.addImage(newPath);
  44. ConvertCmd convert = new ConvertCmd();
  45. //linux下不要设置此值,不然会报错
  46. //convert.setSearchPath(imageMagickPath);
  47. convert.run(op);
  48. }
  49.  
  50. /**
  51. * 根据尺寸缩放图片
  52. * @param width 缩放后的图片宽度
  53. * @param height 缩放后的图片高度
  54. * @param srcPath 源图片路径
  55. * @param newPath 缩放后图片的路径
  56. * @param type 1为比例处理,2为大小处理,如(比例:1024x1024,大小:50%x50%)
  57. */
  58. public static String cutImage(int width, int height, String srcPath, String newPath,int type,String quality) throws Exception {
  59. IMOperation op = new IMOperation();
  60. ConvertCmd cmd = new ConvertCmd(true);
  61. op.addImage();
  62. String raw = "";
  63. if(type == 1){
  64. //按像素
  65. raw = width+"x"+height+"^";
  66. }else{
  67. //按像素百分比
  68. raw = width+"%x"+height+"%";
  69. }
  70. op.addRawArgs("-sample" , raw );
  71. if((quality !=null && quality.equals(""))){
  72. op.addRawArgs("-quality" , quality );
  73. }
  74. op.addImage();
  75.  
  76. String osName = System.getProperty("os.name").toLowerCase();
  77. if(osName.indexOf("win") != -1) {
  78. //linux下不要设置此值,不然会报错
  79. cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.14-Q16");
  80. }
  81.  
  82. try{
  83. cmd.run(op, srcPath, newPath);
  84. }catch(Exception e){
  85. e.printStackTrace();
  86. }
  87. return newPath;
  88. }
  89.  
  90. /**
  91. * 给图片加水印
  92. * @param srcPath 源图片路径
  93. */
  94. public static void addImgText(String srcPath) throws Exception {
  95. IMOperation op = new IMOperation();
  96. op.font("宋体").gravity("southeast").pointsize(18).fill("#BCBFC8").draw("text 100,100 co188.com");
  97. op.addImage();
  98. op.addImage();
  99.  
  100. String osName = System.getProperty("os.name").toLowerCase();
  101. ConvertCmd cmd = new ConvertCmd(true);
  102. if(osName.indexOf("win") != -1) {
  103. //linux下不要设置此值,不然会报错
  104. cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.14-Q16");
  105. }
  106.  
  107. try{
  108. cmd.run(op, srcPath, srcPath);
  109. }catch(Exception e){
  110. e.printStackTrace();
  111. }
  112. }
  113.  
  114. public static void main(String[] args) throws Exception{
  115. //cutImage("D:\\apple870.jpg", "D:\\apple870eee.jpg",98, 48, 370, 320);
  116. Long start = System.currentTimeMillis();
  117. //cutImage(100,100, "e:\\37AF7D10F2D8448A9A5.jpg","e:\\37AF7D10F2D8448A9A5_bak2.jpg",2,"100");
  118. addImgText("e:\\37AF7D10F2D8448A9A5_bak2.jpg");
  119. Long end = System.currentTimeMillis();
  120. System.out.println("time:"+(end-start)/3600);
  121. }
  122. }
  123. 通过GraphicsMagick+im4java实现高质量大图的处理,解决了100M以上,以及图片像素10000以上处理是出现内存溢出的问

GraphicsMagick+im4java实现高质量大图的处理的更多相关文章

  1. python根据关键字以及id值爬取图虫网上高质量大图

    import requests import re import os import time print("ready....") def downPic(dirs, keywo ...

  2. 利用python爬虫关键词批量下载高清大图

    前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小图的批量下载.虽然小图能够在一些移动端可能展示的还行,但是放到pc ...

  3. 《编写高质量代码:Web 前端开发修炼之道》 笔记与读后感

    编写高质量代码:Web 前端开发修炼之道/曹刘阳著. —北京:机械工业出版社,2010.5 第一版 涉及到的知识点: 1. CSS Sprites 在国内很多人叫css精灵,是一种网页图片应用处理方式 ...

  4. 怎样编写高质量的java代码

    代码质量概述     怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍.也请有过代码质量相关经验的朋友 ...

  5. 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛

        如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...

  6. 如何书写高质量的jQuery代码

    想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,参考了一些资料及实际使用效率,将介绍一些书写高质量jQue ...

  7. 高质量C++/C编程指南(林锐)

    推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐   2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐   20 ...

  8. 每周一书-编写高质量代码:改善C程序代码的125个建议

    首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...

  9. KlayGE 4.4中渲染的改进(三):高质量无限地形

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2761   本系列的上一篇讲了DR中的一些改进.本篇开始将描述这个版本加入的新功能,高质量地形 ...

随机推荐

  1. 设计模式学习--组合模式,c++代码

    下面是组合模式的UML类图: <span style="font-family:Microsoft YaHei;font-size:18px;"><span st ...

  2. rails常用命令备忘

    rails new xxx 创建一个新rails项目 rails generate scaffold xxx 创建表模型,视图,控制器和迁移的"脚手架" rake db:migra ...

  3. 每天几分钟跟小猫学前端之node系列:用node实现最简单的爬虫

    先来段求分小视频: https://www.iesdouyin.com/share/video/6550631947750608142/?region=CN&mid=6550632036246 ...

  4. Spring ioc 详解

    引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不 ...

  5. spring中一些aware接口

    Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextA ...

  6. JVM笔记8-虚拟机性能监控与故障处理工具

    1.JDK命令行工具 Java开发人员肯定都知道JDK的bin目录有“java.exe”,"javac.exe"这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他 ...

  7. 使用LSTM和Softmx来进行意图识别

    前言 在前面我们大致介绍了什么是意图识别,把这个问题抽象出来其实是一个分类问题.在结构上面,我们使用LSTM来提取特征,Softmax来进行最后的多分类.由于语料的限制,我们目前仅考虑电台,音乐,问答 ...

  8. C++string函数之strcat_s

    跟上一篇的strcpy_s一样,是新推出的较为安全的strcat函数 strcat_s脱胎于strcat,用于两个字符串的链接,strcat(str1,str2)直接返回新的str1. 但在vs200 ...

  9. 2018 CISCN reverse wp

    2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...

  10. developers.google.com上的开发者文档如何切换显示语言

    一个小的tip,搜索到developers.google.com上的开发者文档,有些被翻译了的会自动显示中本版,如果想看英文版,可以在当前url后面加?hl=en,就会变成英文版.估计是根据地区直接推 ...