zoukankan      html  css  js  c++  java
  • GraphicsMagick+IM4Java在项目中的使用总结

    一)前言:
    服务器端图片上传逻辑改版,将文件自己压缩成3份然后上传至某云进行存储。
    选择GraphicsMagick+IM4Java,放弃并发能力弱的ImageMagick+Jmagick。
    网上可供学习GraphicsMagick与IM4Java的资料是在太少,翻来覆去就那么几篇,碰到异常只能一遍又一遍的研读官方文档!这也是我写这篇文章的原因之一。

    im4java参考资料:

    1)请详见Developer's Guide: http://im4java.sourceforge.net/docs/dev-guide.html
    
    2)github上im4java的源码:https://github.com/Widen/im4java
    

    GraphicsMagick参考资料:

    1)http://www.graphicsmagick.org   
    

    先在本地安装使用测试,觉得性能还OK的话,再放到测试服务器上部署测试实际性能。本地环境是win,win下的GM(GraphicsMagick)就很好安装了,与普通软件安装无异。

    二)使用IM4Java:

    瞧Developer's Guide中的“Before you begin: Setting up the Environment”内容,大意是使用之前先设置工具的工具(当然压缩图片的工具,名字叫gm)的搜索路径,并说明了这几种设置方式的差别。

    比如win下的安装路径,假如我安装的路径是D:GraphicsMagick-1.3.19-Q16,则代码为:

    String myPath="D:\GraphicsMagick-1.3.19-Q16";
    
    ProcessStarter.setGlobalSearchPath(myPath);   
    
    注:我们不能在linux服务器中这么写代码,linux直接就设置环境变量:export PATH=$PATH:/abc...,其中/abc是你的GM工具所在路径,比如我的是/home/db/roderickyu/soft/bin
    

    简单用法就直接看文档吧,我这里写几个文档里不太容易读出来的内容:

    压缩时可以直接添加本地的图片,比如:
    IMOperation op = new IMOperation();
    op.addImage("D:\test.jpg");     // 输入要压缩的文件路径
    op.resize(640);                  // 多番尝试后才知道这是限定width,height等比缩放
    op.addImage("D:\newTest.jpg");  // 压缩后的文件的输出路径,当然可以没有扩展名!
    
    还有一种是对输入流进行压缩,比如官方文档中:
    IMOperation op = new IMOperation();
    op.addImage("-");                   // read from stdin
    op.addImage("tif:-");               // write to stdout in tif-format
    代码中tif是指按照tif格式进行压缩,但是变化不明显(而且压缩后的大小与size大小不成正比),很容易给初学者造成是不是代码不好使的挫败感!将tif换成jpg压缩的大小变化就明显了。这是一个坑!
    
    回到这个需求来,我们只有一个输入流,怎么把这个输入流压缩成3份大小不等的文件呢?
    将输入流转化成byte数组,就不存在流被第一个文件读完第二三的文件没有流可以读时报异常。。。empty input file...
    代码为:
    InputStream fileStream = ......
    int total = fileStream.available();
    byte[] bs = new byte[total];
    fileStream.read(bs);
    

    按照GM的官方文档安装GM时失败,后才得解:安装路径不是当前linux用户的可读写权限内的路径,换成当前身份可读写的路径呗或者换登入身份呗~

    最后测试,发现性能相当优异!

  • 相关阅读:
    WEB前端开发规范文档
    MySQL笔记系列:数据库概述
    MySQL笔记系列:MySQL架构
    Centos6.4中Apache,MySQL,PHP 的安装
    Linux面试总结分享
    NFS网络文件共享服务介绍及案例
    Linux命令(7):cp
    Linux命令(6):cat
    Linux命令(5):vi
    Linux命令(4):touch
  • 原文地址:https://www.cnblogs.com/xu-thinking/p/3660779.html
Copyright © 2011-2022 走看看