`
荷戟者
  • 浏览: 280228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JMagick处理图片代码收集

    博客分类:
  • Java
阅读更多

写在前面的话:

 

如果要在Web Application Server(Resin,Tomcat),需要再运行时加入参数: -Djmagick.systemclassloader=no

或者在程序中写入:System.setProperty("jmagick.systemclassloader", "no");

但是,个人在JBoss上,后者不太管用,所以,建议大家用前者,即启动服务器时加启动参数!

(//Tell jmagick.magick.Magick to not use the system ClassLoader)

 

可能遇到的问题:

 

Exceptions/Errors:
java.lang.NoClassDefFoundError: Could not initialize class magick.ImageInfo
java.lang.UnsatisfiedLinkError: no JMagick in java.library.path

Things I've tried so far:
1) copied jmagick.jar to JAVA_HOME/jre/lib/ext
2) copied jmagick.jar to tomcat(your server) common lib & webapp/web-inf/lib
3) set LD_LIBRARY_PATH=/usr/local/lib in tomcat startup script
4) tried setting -Djava.library.path=/usr/local/lib -Djmagick.systemclassloader=no in tomcat startup script

 

 

自己收藏一下JMagick处理图片的代码,方便随时查阅:

package org.wsr.util;

import java.awt.Dimension;  
import java.awt.Point;  
import java.awt.Rectangle;  
import java.io.File;  
  
import magick.CompositeOperator;  
import magick.CompressionType;  
import magick.DrawInfo;  
import magick.ImageInfo;  
import magick.MagickException;  
import magick.MagickImage;  
import magick.PixelPacket;  
import magick.PreviewType;  
  
public class JMagicjWrapper {  
	
public static void main(String[] args) throws MagickException{  
        
        //test for function imageResize   
          
//        JMagicjWrapper.imageResize("pics.jpg", "reSize20x30.png", 20, 30);  
//        JMagicjWrapper.imageResize("pics.jpg", "reSize250x200.jpeg", 250, 200);  
//        JMagicjWrapper.imageResize("pics.jpg", "reSize50x50.jpg", 50, 50);  
//        JMagicjWrapper.imageResize("pics.jpg", "reSize120x120.bmp", 120, 120);  
//        JMagicjWrapper.imageResize("pics.jpg", "reSize.tif", 20, 30);//not create file   
//          
          
        //test for function createWaterPrintByImg   
        JMagicjWrapper.createWaterPrintByImg("f://1.jpg", "f://4.jpg", "f://watermark.gif", new Point(0,0));  
        //JMagicjWrapper.imageResize("wpl.gif", "logo250x200.gif", 250, 200);  
        //Because file "wpl.gif" may not be release, the later function cause a error, can not open file handle.   
        //JMagicjWrapper.createWaterPrintByImg("pics.jpg", "wpl.gif", "logoFull.jpg", new Point(1680,1050));//not create file   
        //JMagicjWrapper.createWaterPrintByImg("pics.jpg", "wpl.gif", "logoExt.jpg", new Point(2000,1000));//not create file   
          
        //test for function createWaterPrintByText   
        //This function can not handle Chinese Character, I'll continue to takle the issue    
        //JMagicjWrapper.createWaterPrintByText("pics1.jpg", "wpt.gif", "For Test", new Point(300,300), 100);  
    }  
  
    private static final String[] Type = {  
        ".JPG",  
        ".JPEG",  
        ".BMP",  
        ".GIF",  
        ".PNG"  
    };  
      
    public static boolean checkType(String path){  
        for (int i = 0; i < Type.length; i++) {  
            if (path.toUpperCase().endsWith(Type[i])) {  
                return true;  
            }else {  
                continue;  
            }  
        }  
        return false;  
    }  
      
    /**改变图片大小 
     * @param   filePath    原图片位置 
     *          toPath      新图片位置 
     *          width       新图片的宽度 
     *          height      新图片的高度 
     * @return  
     * @throw 
     * @author sulliy@sina.com 2010-8-11 
     */  
    public static void imageResize(String filePath, String toPath, int width, int height)  
            throws MagickException {  
        ImageInfo info = null;  
        MagickImage image = null;  
        Dimension imageDim = null;  
        MagickImage scaled = null;  
          
        if (!checkType(filePath) || !checkType(toPath)) {  
            return;  
        }  
          
        try {  
            info = new ImageInfo();
            image = new MagickImage(info);  
            imageDim = image.getDimension();  
            if (width <= 0 || height <= 0) {  
                height = 120;  
                width = 120;  
            }  
            scaled = image.scaleImage(width, height);  
            scaled.setFileName(toPath);  
            scaled.writeImage(info);  
        } finally {  
            if (scaled != null) {  
                scaled.destroyImages();  
            }  
        }  
    }  
  
    /**创建图片水印 
     * @param       filePath    源文件路径 
     *              toImg       生成文件位置 
     *              logoPath    logo路径 
     *              pos         logo在源图片中的相对位置,以像素点为单位 
     * @return  
     * @throw   MagickException 
     * @author sulliy@sina.com 2010-8-11 
     */  
    public static void createWaterPrintByImg(String filePath, String toImg,  
            String logoPath, Point pos) throws MagickException {  
        if (!checkType(filePath) || !checkType(toImg) || !checkType(logoPath)) {  
            return;  
        }
          
       ImageInfo info = new ImageInfo();  
        MagickImage fImage = null;  
        MagickImage sImage = null;  
        MagickImage fLogo = null;  
        MagickImage sLogo = null;  
        Dimension imageDim = null;
        Dimension logoDim = null;
        try {
        	//原来图片
            fImage = new MagickImage(new ImageInfo(filePath));
            imageDim = fImage.getDimension();
            int width = imageDim.width;
            int height = imageDim.height;
            sImage = fImage.scaleImage(width, height);
              
            fLogo = new MagickImage(new ImageInfo(logoPath));
            logoDim = fLogo.getDimension();
            int lw = logoDim.width;
            int lh = logoDim.height;
            sLogo = fLogo.scaleImage(lw, lh);
              
            //开始打水印,从左上角开始;如果到右边界则重新开始一行的打印(x=0,y=y+h)
            int startX = 0;
            int startY = 0;
            do {            	
                sImage.compositeImage(CompositeOperator.AtopCompositeOp, sLogo,  
                        startX, startY);
                startX += (logoDim.width + 60);
            	if (startX >= width){
            		startY += logoDim.height * 2;
            		startX = 0;
            	}
    		} while(startY <= height);
            
            sImage.setFileName(toImg);
            sImage.writeImage(info);
        } finally {
            if (fImage != null) {
                fImage.destroyImages();
            }
            if (sImage != null) {
            	sImage.destroyImages();
            }
            if (fLogo != null) {
            	fLogo.destroyImages();
            }
            if (sLogo != null) {
            	sLogo.destroyImages();
            }
        }
    }
  
    /**创建文字水印 
     * @param       filePath    源文件路径 
     *              toImg       生成文件位置 
     *              text        水印文本 
     *              pos         logo在源图片中的相对位置,以像素点为单位 
     *              pointSize   用于设置点阵大小 
     * @return  
     * @throw   MagickException 
     * @author sulliy@sina.com 2010-8-11 
     */  
    public static void createWaterPrintByText(String filePath, String toImg, String text  
            , Point pos, int pointSize)  
            throws MagickException {  
        if (!checkType(filePath) || !checkType(toImg)) {  
            return;  
        }  
          
        if (null == text || "".equals(text)) {  
            text = "sulliy@sina.com";  
        }  
          
        ImageInfo info = new ImageInfo(filePath);  
        if (filePath.toUpperCase().endsWith("JPG")  
                || filePath.toUpperCase().endsWith("JPEG")) {  
            info.setCompression(CompressionType.JPEGCompression); // 压缩类别为JPEG格式   
            info.setPreviewType(PreviewType.JPEGPreview); // 预览格式为JPEG格式   
            info.setQuality(95);  
        }  
        MagickImage aImage = new MagickImage(info);  
        Dimension imageDim = aImage.getDimension();  
        int width = imageDim.width;  
        int height = imageDim.height;  
          
        if (width <= (int)pos.getX() || height <= (int)pos.getY()) {  
            pos.setLocation(0, 0);  
        }  
          
        int a = 0;  
        int b = 0;  
        String[] as = text.split("");  
        for (String string : as) {  
            if (string.matches("[/u4E00-/u9FA5]")) {  
                a++;  
            }  
            if (string.matches("[a-zA-Z0-9]")) {  
                b++;  
            }  
        }  
        int tl = a * 12 + b * 6 ;//字符长度   
        MagickImage scaled = aImage.scaleImage(width, height);  
        if (width > tl && height > 5) {  
            DrawInfo aInfo = new DrawInfo(info);  
            aInfo.setFill(PixelPacket.queryColorDatabase("white"));  
            aInfo.setUnderColor(new PixelPacket(65535, 65535, 65535, 65535));//设置为透明颜色   
            aInfo.setPointsize(pointSize);  
            // 解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑   
            String fontPath = "C:/WINDOWS/Fonts/MSIMHEI.TTF";  
            // String fontPath = "/usr/maindata/MSYH.TTF";   
            aInfo.setFont(fontPath);  
            aInfo.setTextAntialias(true);  
            aInfo.setOpacity(0);//透明度   
            aInfo.setText(text);  
            aInfo.setGeometry("+" + ((int)pos.getX() + "+" + (int)pos.getY()));  
            scaled.annotateImage(aInfo);  
        }  
        scaled.setFileName(toImg);  
        scaled.writeImage(info);  
        scaled.destroyImages();  
    }  
  
    /**切取图片 
     * @param       imgPath     原图路径 
     *              toPath      生成文件位置 
     *              w           左上位置横坐标 
     *              h           左上位置竖坐标 
     *              x           右下位置横坐标 
     *              y           右下位置竖坐标 
     * @return  
     * @throw   MagickException 
     * @author sulliy@sina.com 2010-8-11 
     */  
    public static void cutImg(String imgPath, String toPath, int w, int h,  
            int x, int y) throws MagickException {  
        ImageInfo infoS = null;  
        MagickImage image = null;  
        MagickImage cropped = null;  
        Rectangle rect = null;  
        try {  
            infoS = new ImageInfo(imgPath);  
            image = new MagickImage(infoS);  
            rect = new Rectangle(x, y, w, h);  
            cropped = image.cropImage(rect);  
            cropped.setFileName(toPath);  
            cropped.writeImage(infoS);  
  
        } finally {  
            if (cropped != null) {  
                cropped.destroyImages();  
            }  
        }  
    }  
      
    /**删除图片文件 
     * @param   src     图片位置 
     * @return  
     * @throw 
     * @author sulliy@sina.com 2010-8-11 
     */  
    public static boolean removeFile(String src) throws SecurityException{  
        try {  
            if (!checkType(src)) {  
                return false;  
            }  
              
            File file = new File(src);  
            return file.delete();         
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }
    
}  

 

参考:

1、http://blog.csdn.net/sulliy/article/details/5805709

2、http://txf2004.iteye.com/blog/989659

3、http://txf2004.iteye.com/blog/989658

分享到:
评论

相关推荐

    JMagick图片处理

    **JMagick图片处理**是图像操作的重要工具,它是一个Java接口,用于ImageMagick库,使得在Java环境中可以方便地进行图像处理。这个技术涵盖了多个关键知识点,包括创建缩略图、添加水印、切图以及压缩图片,这些都是...

    jmagick图片处理

    jmagick处理图片,图片高质量压缩,图片加水印。

    Jmagick32位的和Jmagick64位的Jmagick.dll,Jmagick.jar

    Jmagick是一款将ImageMagick图像处理库与Java平台相结合的扩展库,它允许Java开发者利用强大的ImageMagick功能来处理图像。在Java应用程序中,Jmagick通过Jmagick.dll动态链接库和Jmagick.jar文件提供对底层C++接口...

    jmagick.jar 用法

    JMagick 是一个 Java 包装器库,它提供了对 ImageMagick 图像处理库的访问。ImageMagick 是一个功能强大的跨平台图像处理工具,而 JMagick 则是将这些功能引入 Java 应用程序的桥梁。通过 JMagick,Java 开发者可以...

    Jmagick缩图 JAVA图片处理

    在IT行业中,图片处理是一项非常重要的任务,尤其是在开发图片搜索系统、社交媒体平台或者任何涉及到大量图像的应用中...结合提供的示例代码,开发者可以迅速将JMagick集成到自己的项目中,提升图片处理的效率和质量。

    jmagick 例子

    《JMagick:Java 图像处理的利器与内存管理策略》 在计算机视觉和Web开发领域,图像处理是一项至关重要的任务。Java作为一种广泛使用的编程语言,提供了多种图像处理库,其中JMagick是一个非常实用的工具,它为Java...

    jmagick-win-6.3.9-Q16

    《JMagick:Java图像处理的强大工具》 在IT领域,图像处理是一项不可或缺的技术,尤其在网站开发、移动应用和数据分析等方面。JMagick作为Java平台上的一个图像处理库,为开发者提供了强大的功能,使他们能够高效地...

    jmagick-win-5.5.7-Q8.zip

    在实际应用中,JMagick可以用于各种场景,如网站的图像上传处理、图片格式转换、图片质量优化等。例如,一个常见的应用场景是用户上传一张大尺寸的照片,服务器端可以通过JMagick进行自动缩放,减少存储空间并加快...

    jmagick jmagick.jar jmagick资料

    里面包括jmagick 所需所有文件,jmagick.dll,jmagick.jar 还有安装文件, 以及linux安装说明! jmagick jmagick.jar jmagick资料 jmagick缩略图 jmagick jmagick.jar jmagick资料 jmagick缩略图

    jmagick安装和配置

    JMagick是一款强大的Java接口,它允许Java应用程序与ImageMagick图像处理库进行交互,从而实现丰富的图像操作功能。本文将详细介绍如何在Java环境中安装和配置JMagick,以及如何使用提供的示例进行测试。 ### 1. ...

    jmagick-win-6.3.9

    - 图像处理服务:在服务器端,JMagick可以作为后台服务,对用户上传的图片进行自动化处理,如生成缩略图、调整尺寸、添加水印等。 - 数据可视化:在数据科学领域,JMagick可以帮助将复杂的数据转换成可视化的图像,...

    jmagick6.4.0

    JMagick是ImageMagick图像处理库的一个Java接口,它为Java开发者提供了一种高效且灵活的方式来处理和操作图像。ImageMagick是一个功能丰富的开源跨平台工具集,能够读取、转换和写入多种图像格式。JMagick将这种能力...

    JMagick-5.5.6-0.tar.gz

    在Java Web开发中,图像处理是一项不可或缺的功能,无论是用于网站设计、数据可视化还是用户上传的图片管理,都需要高效的图像处理库来支持。JMagick-5.5.6-0.tar.gz便是这样一个针对Java平台的图形处理工具,它为...

    jmagick.zip

    JMagick与ImageMagick是两个在图像处理领域中广泛使用的开源库,尤其在Java环境中,它们为开发者提供了强大的图像处理功能。本文将深入探讨这两个工具的核心概念、功能以及如何在实际项目中应用。 首先,JMagick是...

    jmagick-6.2.4-1-IM-6.2.5.zip

    标题中的"jmagick-6.2.4-1-IM-6.2.5.zip"指的是JMagick的一个特定版本,这是一个Java绑定的ImageMagick库,用于处理图像操作和转换。ImageMagick是一个开源的跨平台命令行工具集,广泛用于在各种文件格式之间进行...

    jmagick.jar java图像应用

    jmagick.jar java图像应用

    ImageMagick-6.3.9+jmagick组合

    4. **性能**:虽然通过JNI调用C/C++代码会有一定的性能损失,但JMagick允许Java应用利用ImageMagick的高性能图像处理能力。 5. **应用范围**:JMagick常用于Web服务器上的动态图像生成、图像处理服务或需要在Java...

    jmagick 用法

    JMagick 是一个 Java 的图像处理库,它提供了对 ImageMagick 图像处理库的 Java 接口。ImageMagick 是一个强大的跨平台命令行工具集,用于读取、转换和写入多种格式的图像。通过 JMagick,Java 开发者可以方便地在...

    高质量图片处理Jmagick

    文件包含:ImageMagick-6.4.5-3-Q16-windows-dll.exe,jmagick.dll,jmagick.jar,压缩包中的版本统一,安装ImageMagick,复制ImageMagick安装目录的所有.dll文件和Jmagick.dll到,系统的system32下 即可使用,System.set...

    jmagick 软件、安装说明(window和linux两个版本)

    JMagick是一款强大的Java接口,它允许Java应用程序直接访问ImageMagick的图像处理功能。ImageMagick是一个广泛使用的跨平台图像处理库,能够读取、转换和写入多种图像格式。通过JMagick,开发者可以在Java环境中无缝...

Global site tag (gtag.js) - Google Analytics