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平台下,则不需要配置。

package imageUtils;

import java.io.IOException;
import java.util.ArrayList; import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation; /**
* @author hegh E-mail: heguanhua@tjhq.com
* @version 创建时间:Mar 13, 2012 10:43:12 AM 类说明
*/
public class ImageMagick { /** * ImageMagick的路径 */
public static String imageMagickPath = null;
static{ /**获取ImageMagick的路径 */
//Properties prop = new PropertiesFile().getPropertiesFile();
//linux下不要设置此值,不然会报错
//imageMagickPath = prop.getProperty("imageMagickPath");
} /** * 根据坐标裁剪图片
* @param srcPath 要裁剪图片的路径
* @param newPath 裁剪图片后的路径
* @param x 起始横坐标
* @param y 起始挫坐标
* @param x1 结束横坐标
* @param y1 结束挫坐标
*/
public static void cutImage(String srcPath, String newPath, int x, int y, int x1, int y1)
throws Exception {
int width = x1 - x; int height = y1 - y;
IMOperation op = new IMOperation();
op.addImage(srcPath);
/**
* width:裁剪的宽度
* height:裁剪的高度
* x:裁剪的横坐标
* y:裁剪的挫坐标
*/
op.crop(width, height, x, y);
op.addImage(newPath);
ConvertCmd convert = new ConvertCmd();
//linux下不要设置此值,不然会报错
//convert.setSearchPath(imageMagickPath);
convert.run(op);
} /**
* 根据尺寸缩放图片
* @param width 缩放后的图片宽度
* @param height 缩放后的图片高度
* @param srcPath 源图片路径
* @param newPath 缩放后图片的路径
* @param type 1为比例处理,2为大小处理,如(比例:1024x1024,大小:50%x50%)
*/
public static String cutImage(int width, int height, String srcPath, String newPath,int type,String quality) throws Exception {
IMOperation op = new IMOperation();
ConvertCmd cmd = new ConvertCmd(true);
op.addImage();
String raw = "";
if(type == 1){
//按像素
raw = width+"x"+height+"^";
}else{
//按像素百分比
raw = width+"%x"+height+"%";
}
op.addRawArgs("-sample" , raw );
if((quality !=null && quality.equals(""))){
op.addRawArgs("-quality" , quality );
}
op.addImage(); String osName = System.getProperty("os.name").toLowerCase();
if(osName.indexOf("win") != -1) {
//linux下不要设置此值,不然会报错
cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.14-Q16");
} try{
cmd.run(op, srcPath, newPath);
}catch(Exception e){
e.printStackTrace();
}
return newPath;
} /**
* 给图片加水印
* @param srcPath 源图片路径
*/
public static void addImgText(String srcPath) throws Exception {
IMOperation op = new IMOperation();
op.font("宋体").gravity("southeast").pointsize(18).fill("#BCBFC8").draw("text 100,100 co188.com");
op.addImage();
op.addImage(); String osName = System.getProperty("os.name").toLowerCase();
ConvertCmd cmd = new ConvertCmd(true);
if(osName.indexOf("win") != -1) {
//linux下不要设置此值,不然会报错
cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.14-Q16");
} try{
cmd.run(op, srcPath, srcPath);
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) throws Exception{
//cutImage("D:\\apple870.jpg", "D:\\apple870eee.jpg",98, 48, 370, 320);
Long start = System.currentTimeMillis();
//cutImage(100,100, "e:\\37AF7D10F2D8448A9A5.jpg","e:\\37AF7D10F2D8448A9A5_bak2.jpg",2,"100");
addImgText("e:\\37AF7D10F2D8448A9A5_bak2.jpg");
Long end = System.currentTimeMillis();
System.out.println("time:"+(end-start)/3600);
}
}
通过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. BP 神经网络

    BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一.BP ...

  2. 两种方法 更改 EBS R12界面LOGO以及内容

    from:metalink more: Note 174219.1 - How To Change The Logo In The Oracle Application Menu Note 84975 ...

  3. unix下各种查看“变量”的命令比较

    子程序只会继承父程序的环境变量,而不继承其自定义变量. env 查看所有环境变量 set 查看所有变量,包括环境变量和自定义变量 set 还可以给程序位置参数赋值: set 1 2 3 将1赋值给$1 ...

  4. Xcode使用心得02:如何在项目中关闭ARC特性

    在obj-c系列内存管理的博文里大家应该对ARC有所了解,一般是不推荐关闭ARC特性的,但你也保不齐啥时候有这个需求,于是乎我们看看在最新的x6b中如何将其关闭吧. 因为Build Seting里的子 ...

  5. rails将类常量重构到数据库对应的表中之一

    问题是这样:原来代码.html.erb页面中有一个select元素,其每个item对应的是model中的类常量: <%= f.select :pay_type,Order::PAYMENT_TY ...

  6. Java不走弯路教程(5.Client-Server模式(2)-Client)

    5.Client-Server模式(2)-Client 在上一章,我们完成一个简单的数据库服务器,并在客户端用telnet方式成功进行通信. 本章将用Java实现客户端程序,来代替telnet. 先看 ...

  7. 高性能缓存系统Memcached在ASP.NET MVC中应用

    在Memcached中实体类型未经序列化不能在Memcached中缓存,因此需要对实体类进行处理,才能缓存下来. Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库 ...

  8. Spring Cloud入门教程-Ribbon实现客户端负载均衡

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负 ...

  9. jquery.js

    /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license //@ sourceMappingUR ...

  10. 基于Django的独立运行脚本开发

    1.在Django框架下工作时间长了,会对Django的技术设施产生依赖,比如其方便的ORM,如果写基于Django的独立运行脚本,主要在脚本前面加上以下代码: import sys,os,djang ...