GraphicsMagick+im4java 实现高质量大图的处理

GraphicsMagick下载地址:http://www.skycn.com/soft/appid/398142.html

im4java maven 配置

<dependency>  
    <groupId>org.im4java</groupId>  
    <artifactId>im4java</artifactId>  
    <version>1.4.0</version>  
</dependency>

ImageUtils.java

import java.awt.Color;  
import java.io.File;  
import java.io.IOException;  
  
import org.im4java.core.CompositeCmd;  
import org.im4java.core.ConvertCmd;  
import org.im4java.core.IM4JavaException;  
import org.im4java.core.IMOperation;  
import org.im4java.core.IdentifyCmd;  
  
public final class ImageUtils {  
      
    private static String gmPath;  
  
    static {  
        File file1;  
        File file2;  
        if (gmPath == null) {  
            String osName = System.getProperty("os.name").toLowerCase();  
            if (osName.indexOf("windows") >= 0) {  
                String path = System.getenv("Path");  
                if (path != null) {  
                    String[] paths = path.split(";");  
                    for (String str : paths) {  
                        file1 = new File(str.trim() + "/gm.exe");  
                        file2 = new File(str.trim() + "/gmdisplay.exe");  
                        if ((file1.exists()) && (file2.exists())) {  
                            gmPath = str.trim();  
                            break;  
                        }  
                    }  
                }  
            }  
        }  
        try {  
            IMOperation imo = new IMOperation();  
            imo.version();  
            IdentifyCmd identifyCmd = new IdentifyCmd(true);  
            if (gmPath != null) {  
                identifyCmd.setSearchPath(gmPath);  
            }  
            identifyCmd.run(imo, new Object[0]);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
  
    /** 
     *  
     * @param srcFile 
     *            源文件 
     * @param destFile 
     *            生成文件 
     * @param destWidth 
     *            生成文件的宽度 
     * @param destHeight 
     *            生成文件的高度 
     * @param type 
     *            类型 1:像素2:百分比 
     */  
    public static void zoom(File srcFile, File destFile, int destWidth,  
            int destHeight, int type) {  
         IMOperation op = new IMOperation();        
           ConvertCmd cmd = new ConvertCmd(true);  
           op.addImage();  
           String raw = "";  
           if(type == 1){  
            //按像素  
            raw = destWidth+"x"+destHeight+"^";  
           }else{  
            //按像素百分比  
            raw = destWidth+"%"+destHeight+"%";  
           }   
           op.addRawArgs("-sample",raw);  
           op.addRawArgs("-gravity","center");  
           op.addRawArgs("-quality","100");  
           op.addImage();    
             
           String osName = System.getProperty("os.name").toLowerCase();  
           if(osName.indexOf("win") != -1) {  
            //linux下不要设置此值,不然会报错  
            cmd.setSearchPath("F:/GraphicsMagick-1.3.9-Q16");  
           }  
           
           try{  
            cmd.run(op, srcFile.getPath(), destFile.getPath());         
           }catch(Exception e){  
            e.printStackTrace();  
           }  
    }  
    public static void initialize() {  
    }  
}

ImageMagick.java

import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;
 
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+"%"+height+"%";
   } 
   op.addRawArgs("-sample",raw);
   op.addRawArgs("-gravity","center");
   op.addRawArgs("-quality","100");
   op.addImage();  
   
   String osName = System.getProperty("os.name").toLowerCase();
   if(osName.indexOf("win") != -1) {
    //linux下不要设置此值,不然会报错
    cmd.setSearchPath("F:/GraphicsMagick-1.3.9-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("Arial").gravity("Center").pointsize(18).fill("red").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("F:/GraphicsMagick-1.3.9-Q16");
   }
 
   try{
    cmd.run(op, srcPath, "f:\\2m_test.jpg");       
   }catch(Exception e){
    e.printStackTrace();
   }
  }
   
  public static void main(String[] args) throws Exception{
  // cutImage("f:\\abc.jpg", "f:\\abcaa.jpg",98, 48, 370, 320);
   Long start = System.currentTimeMillis();
   cutImage(10,10, "f:\\abc.jpg","f:\\abcaa.jpg",2,"100");
//   addImgText("f:\\2m.jpg");
//   addImgText("f:\\abc.jpg");
   Long end = System.currentTimeMillis();
   System.out.println("time:"+(end-start));
  }
}

GraphicsMagick常用方法

1. 显示图像文件详细信息
gm identify a.jpg
2.更改当前目录下*.jpg的尺寸大小,并保存于目录.thumb里面
gm mogrify -output-directory .thumbs -resize 320×200 *.jpg
3. 将三幅图像和并为一副图像
gm montage -mode concatenate -tile 3×1 image1.ppm image2.ppm image3.ppm concatenated.miff
4. 显示图像
gm display ‘vid:*.jpg’
5. 格式转换
gm convert a.bmp a.jpg
gm convert a.bmp a.pdf(转换为pdf)
6. 调整图像dpi和大小
gm convert -density 288 -geometry 25% image.gif image.gif
(缩小为原先的1/4,并且dpi为288)
gm convert -resize 640×480 image.gif image.gif
(转换为640×480的图像)
7. 在图像上添加文字
gm convert -font Arial -fill blue -pointsize 18 -draw “text 10,10 ‘your text here’” test.tif test.png
8. 从gif文件中抽取第一帧
gm convert “Image.gif[0]” first.gif
9. 建立gif图像
gm convert -delay 20 frame*.gif animation.gif
gm convert -loop 50 frame*.gif animation.gif
(让动画循环50次)
gm convert -delay 20 frame1.gif -delay 10 frame2.gif -delay 5 frame3.gif animation.gif
(对每一帧手动指定延时)
10. 截屏
gm import a.jpg
用鼠标点击所要截取的窗口,或者选择截屏区域,保存为a.jpg
gm import -frame a.jpg
保留窗口的边框

GraphicsMagick API

http://www.graphicsmagick.org/GraphicsMagick.html


你可能感兴趣的:(GraphicsMagick+im4java 实现高质量大图的处理)