GraphicsMagick+im4java实现高质量大图的处理
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实现高质量大图的处理的更多相关文章
- python根据关键字以及id值爬取图虫网上高质量大图
import requests import re import os import time print("ready....") def downPic(dirs, keywo ...
- 利用python爬虫关键词批量下载高清大图
前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小图的批量下载.虽然小图能够在一些移动端可能展示的还行,但是放到pc ...
- 《编写高质量代码:Web 前端开发修炼之道》 笔记与读后感
编写高质量代码:Web 前端开发修炼之道/曹刘阳著. —北京:机械工业出版社,2010.5 第一版 涉及到的知识点: 1. CSS Sprites 在国内很多人叫css精灵,是一种网页图片应用处理方式 ...
- 怎样编写高质量的java代码
代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍.也请有过代码质量相关经验的朋友 ...
- 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛
如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...
- 如何书写高质量的jQuery代码
想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,参考了一些资料及实际使用效率,将介绍一些书写高质量jQue ...
- 高质量C++/C编程指南(林锐)
推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 20 ...
- 每周一书-编写高质量代码:改善C程序代码的125个建议
首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...
- KlayGE 4.4中渲染的改进(三):高质量无限地形
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2761 本系列的上一篇讲了DR中的一些改进.本篇开始将描述这个版本加入的新功能,高质量地形 ...
随机推荐
- 设计模式学习--组合模式,c++代码
下面是组合模式的UML类图: <span style="font-family:Microsoft YaHei;font-size:18px;"><span st ...
- rails常用命令备忘
rails new xxx 创建一个新rails项目 rails generate scaffold xxx 创建表模型,视图,控制器和迁移的"脚手架" rake db:migra ...
- 每天几分钟跟小猫学前端之node系列:用node实现最简单的爬虫
先来段求分小视频: https://www.iesdouyin.com/share/video/6550631947750608142/?region=CN&mid=6550632036246 ...
- Spring ioc 详解
引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不 ...
- spring中一些aware接口
Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextA ...
- JVM笔记8-虚拟机性能监控与故障处理工具
1.JDK命令行工具 Java开发人员肯定都知道JDK的bin目录有“java.exe”,"javac.exe"这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他 ...
- 使用LSTM和Softmx来进行意图识别
前言 在前面我们大致介绍了什么是意图识别,把这个问题抽象出来其实是一个分类问题.在结构上面,我们使用LSTM来提取特征,Softmax来进行最后的多分类.由于语料的限制,我们目前仅考虑电台,音乐,问答 ...
- C++string函数之strcat_s
跟上一篇的strcpy_s一样,是新推出的较为安全的strcat函数 strcat_s脱胎于strcat,用于两个字符串的链接,strcat(str1,str2)直接返回新的str1. 但在vs200 ...
- 2018 CISCN reverse wp
2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...
- developers.google.com上的开发者文档如何切换显示语言
一个小的tip,搜索到developers.google.com上的开发者文档,有些被翻译了的会自动显示中本版,如果想看英文版,可以在当前url后面加?hl=en,就会变成英文版.估计是根据地区直接推 ...