ImageMagic for windows

来源:互联网 发布:时间悖论 知乎 编辑:程序博客网 时间:2024/05/19 00:54
1、安裝ImageMagick-6.2.6-8-Q16-windows-dll.exe

2、把安裝目錄下所有的dll文件copy到c:/windows/system32目錄下,以便調用dll。

3、解壓jmagick-6.2.6-win.zip,把q16/jmagick.dll copy 到c:/windows/system32目錄下。

4、把jar/jmagick.jar,q16/jmagick.dll copy 到jre的bin中(jdk的bin/lib中)。

5、利用jar/jmagick.jar進行java 開發。


如下是一些例子代碼:
3. 程序参考:
  JMagickScale.java 实现图片缩略图
------------------------------------------------------------------
package images;
import magick.ImageInfo;
import magick.MagickException;
import magick.MagickImage;
public class JMagickScale {
/**
* Description:
* @param args
* @throws MagickException
*/
public static void main(String[] args) throws MagickException {
System.setProperty("jmagick.systemclassloader","no");

//reading image
ImageInfo info = new ImageInfo("c:/image4.bmp");
MagickImage image = new MagickImage(info);

//resize image
MagickImage scaleImg = image.scaleImage(95, 80);

//write image to file
scaleImg.setFileName("c:/MyFile4.bmp");
scaleImg.writeImage(info);
}
}
JMagickTest.java 实现图片的各种操作示例,如旋转,加边框,设置背景,提升质量,加盖文字说明等等...
-----------------------------------------------------------------------------------------------------------------------------
package images;
import java.awt.Dimension;
import java.awt.Rectangle;
import magick.ImageInfo;
import magick.MagickImage;
import magick.MagickException;
import magick.QuantizeInfo;
import magick.ColorspaceType;
import magick.MagickApiException;
import magick.PixelPacket;
import magick.DrawInfo;
import magick.ResolutionType;
import magick.ProfileInfo;
import magick.MontageInfo;
import magick.Magick;
import magick.MagickInfo;
import java.io.IOException;
import java.io.FileOutputStream;
/**
* For testing JMagick functions.
*
* @author Eric Yeo
*/
public class JMagickTest {
  /**
  * Display the information about the profile supplied.
  *
  * @param profile
  *         the profile for which to display
  */
  private static void displayProfile(ProfileInfo profile) {
    if (profile.getName() == null) {
        System.out.println("Profile name is null");
    }
    else {
        System.out.println("Profile name is " + profile.getName());
    }
    if (profile.getInfo() == null) {
        System.out.println("No profile info");
    }
    else {
        System.out.println("Profile length is " + profile.getInfo().length);
    }
  }
  public static void main(String[] args) {
    try {
        Rectangle rect = new Rectangle(0, 0, 80, 40);
        int flags = Magick.parseImageGeometry("60x50", rect);
        System.out.println("Scaled to " + rect.width + "x" + rect.height);
        // Copy an image.
        ImageInfo info = new ImageInfo("pics.jpg");
        info.setPage("50x50+0+0");
        info.setUnits(ResolutionType.PixelsPerInchResolution);
        info.setColorspace(ColorspaceType.RGBColorspace);
        info.setBorderColor(PixelPacket.queryColorDatabase("red"));
        info.setDepth(8);
        System.out.println("Depth "+info.getDepth());
        info.setDepth(0);
        MagickImage image = new MagickImage(info);
        image.setImageAttribute("Comment", "Processed by JMagick");
        System.out.println("Quality is "+image.getQuality());
        System.out.println("Colorspace is " + image.getColorspace());
        System.out.println("Resolution units is " + image.getUnits());
        System.out.println("X resolution is " + image.getXResolution());
        System.out.println("Y resolution is " + image.getYResolution());
        System.out.println("Size blob is " + image.sizeBlob());
        System.out.println("Colors " + image.getColors());
        System.out.println("Total colors " + image.getTotalColors());
        System.out.println("Depth is "+image.getDepth());
        image.signatureImage();
        image.setFileName("copy.jpg");
        image.writeImage(info);
        // Background Color
        System.out.println("Old colour " + image.getBackgroundColor());
        image.setBackgroundColor(PixelPacket.queryColorDatabase("red"));
        System.out.println("New colour " + image.getBackgroundColor());
        // Border image
        image.setBorderColor(PixelPacket.queryColorDatabase("green"));
        MagickImage borderedImage = image.borderImage(new Rectangle(0, 0,
            10, 20));
        borderedImage.setFileName("border.jpg");
        borderedImage.writeImage(info);
        // Raise image
        MagickImage raisedImage = new MagickImage(new ImageInfo("pics.jpg"));
        raisedImage.raiseImage(new Rectangle(0, 0, 10, 20), true);
        raisedImage.setFileName("raised.jpg");
        raisedImage.writeImage(info);
        // Profile test
        System.out.println("Number of generic profiles "
            + image.getGenericProfileCount());
        displayProfile(image.getColorProfile());
        image.setColorProfile(new ProfileInfo());
        displayProfile(image.getColorProfile());
        image.setColorProfile(new ProfileInfo("Test", new byte[20]));
        displayProfile(image.getColorProfile());
        // Montage test
        MagickImage images[] = new MagickImage[2];
        images[0] = image;
        images[1] = image;
        MagickImage seqImage = new MagickImage(images);
        MontageInfo montageInfo = new MontageInfo(new ImageInfo());
        montageInfo.setFileName("montage.jpg");
        montageInfo.setTitle("Melbourne");
        montageInfo.setBorderWidth(5);
        MagickImage montage = seqImage.montageImages(montageInfo);
        montage.writeImage(new ImageInfo());
       
        // Converting the montage into a blob
        montage.setMagick("JPG");
        byte[] mblob = montage.imageToBlob(new ImageInfo());
        System.out.println("Length "+mblob.length);
        // Test average
        MagickImage average = seqImage.averageImages();
        average.setFileName("average.jpg");
        average.writeImage(new ImageInfo());
        // Image to blob
        info = new ImageInfo();
        byte[] blob = image.imageToBlob(info);
        // Blob to image
        info = new ImageInfo();
        MagickImage blobImage = new MagickImage(info, blob);
        Dimension imageDim = blobImage.getDimension();
        System.out.println("Blob width is " + imageDim.width);
        System.out.println("Blob heght is " + imageDim.height);
        System.out.println(imageDim);
        blobImage.setFileName("blob.jpg");
        blobImage.writeImage(info);
        // JPEG Image to GIF blob
        image.setMagick("GIF");
        blob = image.imageToBlob(info);
        try {
          FileOutputStream out = new FileOutputStream("blob.gif");
          out.write(blob);
          out.close();
        }
        catch (IOException ex) {
          System.out.println("Unable to write blob to file: " + ex);
        }
        // Rotation and shear
        image = new MagickImage(new ImageInfo("pics.jpg"));
        MagickImage rotated = image.rotateImage(45.0);
        rotated.setFileName("rotated.jpg");
        rotated.writeImage(info);
        MagickImage sheared = image.shearImage(50.0, 10.0);
        sheared.setFileName("sheared.jpg");
        sheared.writeImage(info);
        MagickImage scaled = image.scaleImage(100, 80);
        scaled.setFileName("scaled.jpg");
        scaled.writeImage(info);
        // Cloning
        imageDim = image.getDimension();
        System.out.println("Width is " + imageDim.width);
        System.out.println("Height is " + imageDim.height);
        System.out.println("Depth is " + image.getDepth());
        System.out.println("Storage class is " + image.getStorageClass());
        System.out.println("Comment is /""
            + image.getImageAttribute("Comment") + "/"");
        MagickImage clonedImage = image.cloneImage(0, 0, false);
        clonedImage.setFileName("clone.jpg");
        clonedImage.writeImage(info);
        // Quantization
        MagickImage quantizedImage = new MagickImage(new ImageInfo(
            "pics.jpg"));
        QuantizeInfo quantizeInfo = new QuantizeInfo();
        quantizeInfo.setColorspace(ColorspaceType.GRAYColorspace);
        quantizeInfo.setNumberColors(256);
        quantizeInfo.setTreeDepth(4);
        System.out.println("QuantizeImage "
            + quantizedImage.quantizeImage(quantizeInfo));
        System.out.println("Colors " + quantizedImage.getColors());
        System.out.println("Total colors "
            + quantizedImage.getTotalColors());
        quantizedImage.setFileName("quantized.png");
        quantizedImage.writeImage(info);
//         for (int i = 0; i < quantizedImage.getColors(); i++) {
//           PixelPacket pp = quantizedImage.getColormap(i);
//           System.out.println("Colormap[" + i + "] = (" + pp.getRed()
//                 + ", " + pp.getGreen() + ", " + pp.getBlue() + ")");
//         }
//         PixelPacket[] ppArray = quantizedImage.getColormap();
//         for (int i = 0; i < quantizedImage.getColors(); i++) {
//           System.out.println("Colormap2[" + i + "] = ("
//                 + ppArray .getRed() + ", " + ppArray.getGreen()
//                 + ", " + ppArray.getBlue() + ")");
//         }
        // Create an image from scratch
        MagickImage blankImage = new MagickImage();
        byte[] pixels = new byte[200 * 100 * 4];
        for (int i = 0; i < 200 * 100; i++) {
          pixels[4 * i] = (byte) 255;
          pixels[4 * i + 1] = (byte) 255;
          pixels[4 * i + 2] = (byte) 255;
          pixels[4 * i + 3] = (byte) 0;
        }
        blankImage.constituteImage(200, 100, "RGBA", pixels);
        // Put a red rectangle around the border
        DrawInfo drawInfo = new DrawInfo(new ImageInfo());
        drawInfo.setPrimitive("Rectangle 10 10 190 90");
        drawInfo.setStroke(PixelPacket.queryColorDatabase("red"));
        drawInfo.setFill(PixelPacket.queryColorDatabase("white"));
        blankImage.drawImage(drawInfo);
        // Annotate the image with a green Hello
        ImageInfo blankImageInfo = new ImageInfo();
        DrawInfo annotateInfo = new DrawInfo(blankImageInfo);
        annotateInfo.setOpacity(0);
        annotateInfo.setFont("fixed");
        annotateInfo.setFill(PixelPacket.queryColorDatabase("green"));
        annotateInfo.setText("Hello");
        annotateInfo.setGeometry("+30+30");
        blankImage.annotateImage(annotateInfo);
        blankImage.setFileName("blank.jpg");
        blankImage.writeImage(info);
        // Make the white page of the image transparent
        blankImage.transparentImage(
            PixelPacket.queryColorDatabase("white"), 65535);
        blankImage.setFileName("transparent.png");
        blankImage.writeImage(info);
        // Crop image
        rect = new Rectangle(20, 20, 150, 120);
        MagickImage cropped = image.cropImage(rect);
        cropped.setFileName("cropped.jpg");
        cropped.writeImage(info);
        // Chop image
        rect = new Rectangle(0, 0, 150, 120);
        MagickImage chopped = image.chopImage(rect);
        chopped.setFileName("chopped.jpg");
        chopped.writeImage(info);
        // Sharpen image
        MagickImage sharpened = image.sharpenImage(1.0, 5.0);
        sharpened.setFileName("sharpened.jpg");
        sharpened.writeImage(info);
        // Despeckle image
        MagickImage despeckled = image.despeckleImage();
        despeckled.setFileName("despeckled.jpg");
        despeckled.writeImage(info);
        // Convolve image
        double[] kernel = new double[9];
        for (int i = 0; i < 9; i++) {
          kernel = 1.0;
        }
        kernel[4] = 2.0;
        MagickImage convolvedImage = image.convolveImage(3, kernel);
        convolvedImage.setFileName("convolved.jpg");
        convolvedImage.writeImage(info);
        // Finally display the image.
        MagickWindow window = new MagickWindow(image);
        window.setVisible(true);
        // MagickInfo test
        MagickInfo minfo = new MagickInfo("JPEG");
        System.out.println("JPG description: " + minfo.getDescription());
    }
    catch (MagickApiException ex) {
        System.err.println("MagickException: " + ex + ": " + ex.getReason()
            + ", " + ex.getDescription());
    }
    catch (MagickException ex) {
        System.err.println("MagickException: " + ex);
    }
  }
}

MagickWindow.java 在java.awt组件中显示
-----------------------------------------------------------------------------------------------------------------------
package images;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import magick.MagickImage;
import magick.util.MagickViewer;
/**
* This class implements a window that displays a MagickImage.
*
* @author Eric Yeo
*/
public class MagickWindow extends Frame {
  /**
  * A listener that exits the application when we receive
  * the window closing event.
  */
  private final class MyListener extends WindowAdapter {
/**
* This method is called when the window closes.
*/
public void windowClosing(WindowEvent event)
{
  System.exit(0);
}
  }
  /**
  * We want the window size to be this big.
  */
  public Dimension getPreferredSize() {
return new Dimension(250, 200);
  }
  /**
  * We want the window size to be at this minimum.
  */
  public Dimension getMinimumSize() {
return new Dimension(300, 200);
  }

  /**
  * Constructor.
  */
  public MagickWindow(MagickImage image)
  {
setResizable(true);
addWindowListener(new MyListener());
MagickViewer imageViewer = new MagickViewer();
add(imageViewer, "Center");

setTitle("Magick Window");
pack();
imageViewer.setImage(image);
  }
}





Re: throwMagickApiException: Unable to create description string
From: Eric Yeo <ttey <at> yeo.id.au>
Subject: Re: throwMagickApiException: Unable to create description string
Newsgroups: gmane.comp.java.jmagick
Date: 2004-12-08 11:18:35 GMT

On Tue, 2004-12-07 at 06:25, Niclas wrote:
> Hello,
>
> I have a problem getting JMagick to work. I'm running
> the following java code:
>
>   System.out.println("creating imageinfo");
>   ImageInfo imageInfo = new ImageInfo(sourceName);
>   System.out.println("creating magickimage");
>   MagickImage magickImage = new
> MagickImage(imageInfo);
>
> Which produces the following output:
>
> creating imageinfo
> Set the file name in ImageInfo to test_cmyk.jpg
> creating magickimage
> Attempting to read from file test_cmyk.jpg
> throwMagickApiException: Unable to create description
> string
>
> the program later blows up with a
> "magick.MagickException: Cannot obtain image handle"
> because (I guess) the MagickImage object is not valid.

Is there a possibility that there are other versions of ImageMagick
libraries? Problem such as this can be a result of linking to the wrong
version of ImageMagick.

Regards,

(Continue reading)


Permalink | Reply | 0 comments |
headersnazma kani | 8 Dec 14:05

problem in executing jmagic in windows2000
From: nazma kani <nazmakani <at> yahoo.co.in>
Subject: problem in executing jmagic in windows2000
Newsgroups: gmane.comp.java.jmagick
Date: 2004-12-08 13:05:48 GMT


hello,
i downloaded ImageMagic in to my system. i am having windows 2000instatlled on my system, it worked fine. and then i download JMagick. ikept the jmagick.dll file at c:/winnt/System32 and atc:/j2sdk1.4.1_01/jre/bin.
and libray atc:/j2sdk1.4.1_01/jre/lib/ext/; and set my classpath to jar file. nowthe problem is if i tryed to compile it it compiled without any error.when i tried to execute the file it guve errirm


"The procedure entry point entry DestroyMagickInfo could not be located in the dynamic link library CORE_RL_magick"



Then i changed to another system where windows xp is installed andthere i found the java file is compiled and when i tried to execute it. then it generated one *.log file. the log file is as follows




An unexpected exc eption has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x77F53C89
Function=RtlQueryInformationActivationContext+0x76B
Library=C:/WINDOWS/WINXP/System32/ntdll.dll

Current Java thread:
at magick.MagickImage.readImage(Native Method)
at magick.MagickImage.<init>(MagickImage.java:90)
at Hello.<init>(Hello.java:22)
at Hello.main(Hello.java:43)

Dynamic libraries:
0x00400000 - 0x00406000 C:/j2sdk1.4.1_01/bin/java.exe
0x77F50000 - 0x77FF9000 C:/WINDOWS/WINXP/System32/ntdll.dll
0x77E60000 - 0x77F40000 C:/WINDOWS/WINXP/system32/kernel32.dll
0x77DD0000 - 0x77E5B000 C:/WINDOWS/WINXP/system32/ADVAPI32.dll
0x78000000 - 0x7806F000 C:/WINDOWS/WINXP/system32/RPCRT4.dll
0x77C10000 - 0x77C63000 C:/WINDOWS /WINXP/system32/MSVCRT.dll
0x6D330000 - 0x6D45A000 C:/j2sdk1.4.1_01/jre/bin/client/jvm.dll
0x77D40000 - 0x77DC6000 C:/WINDOWS/WINXP/system32/USER32.dll
0x77C70000 - 0x77CAE000 C:/WINDOWS/WINXP/system32/GDI32.dll
0x76B40000 - 0x76B6C000 C:/WINDOWS/WINXP/System32/WINMM.dll
0x629C0000 - 0x629C8000 C:/WINDOWS/WINXP/System32/LPK.DLL
0x72FA0000 - 0x72FFA000 C:/WINDOWS/WINXP/System32/USP10.dll
0x6D1D0000 - 0x6D1D7000 C:/j2sdk1.4.1_01/jre/bin/hpi.dll
0x6D300000 - 0x6D30D000 C:/j2sdk1.4.1_01/jre/bin/verify.dll
0x6D210000 - 0x6D229000 C:/j2sdk1.4.1_01/jre/bin/java.dll
0x6D320000 - 0x6D32D000 C:/j2sdk1.4.1_01/jre/bin/zip.dll
0x10000000 - 0x1001E000 C:/j2sdk1.4.1_01/jre/bin/JMagick.dll
0x0AC20000 - 0x0ADDB000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_magick_.dll
0x0A DE0000 - 0x0AE93000 c:/program files/imagemagick-6.1.4-q16/X11.dll
0x71AD0! 000 - 0x71AD8000 C:/WINDOWS/WINXP/System32/WSOCK32.dll
0x71AB0000 - 0x71AC5000 C:/WINDOWS/WINXP/System32/WS2_32.dll
0x71AA0000 - 0x71AA8000 C:/WINDOWS/WINXP/System32/WS2HELP.dll
0x0AEA0000 - 0x0AEB2000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_zlib_.dll
0x7C340000 - 0x7C396000 c:/program files/imagemagick-6.1.4-q16/MSVCR71.dll
0x00950000 - 0x0095F000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_bzlib_.dll
0x0AEC0000 - 0x0AEE9000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_lcms_.dll
0x0AEF0000 - 0x0AF33000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_tiff_.dll
0x0AF40000 - 0x0AF60000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_jpeg_.dll
0x0AF60000 - 0x0AFBB000 c:/program files/imagemagick-6.1.4-q16/CORE_RL_ttf_.dll
0x67820000 - 0x6 7826000 C:/Program Files/ImageMagick-6.1.4-Q16/modules/coders/IM_MOD_RL_RAW_.dll
0x76C90000 - 0x76CB2000 C:/WINDOWS/WINXP/system32/imagehlp.dll
0x6D510000 - 0x6D58C000 C:/WINDOWS/WINXP/system32/DBGHELP.dll
0x77C00000 - 0x77C07000 C:/WINDOWS/WINXP/system32/VERSION.dll
0x76BF0000 - 0x76BFB000 C:/WINDOWS/WINXP/System32/PSAPI.DLL

Local Time = Tue Dec 07 15:46:23 2004
Elapsed Time = 1
#
# The exception above was detected in native code outside the VM
#
# Java VM: Java HotSpot(TM) Client VM (1.4.1_01-b01 mixed mode)
#



i don't understand why this error is coming because my java file is small and it is as shown below.


import magick.*;

public class Sample {
Sample() {
&n bsp; try {
  ImageInfo infos = new ImageInfo("C:/1.jpg"):
    MagickImage image= new MagickImage(infos);
}

 
} catch (Exception e) {
    System.out.println(e);
}
}
public static void main(String args[])
{
  Sample s = new Sample();
  System.out.println("hello");
}

}



----------------------------------------------------------------------



i found that the error is coming at the line

MagickImage image= new MagickImage(infos);

why i am getting this error . what i need to be done inorder to use jmagick in both of my systems. please anyone help me.

i am really in need of solution for this because i am working in theproject related to images. where i need to take two images randomly andcreate one final gif image.
Thanking you in advance.

NAJMA


Yahoo! India Matrimony: Find your life partner online.

_______________________________________________
JMagick mailing list
JMagick <at> yeo.id.au
http://www.yeo.id.au/mailman/listinfo/jmagick


现在web应用经常会用到缩略图。然后一旦生成的缩略图小于100px * 100px,一些常用的java包,生成的图片确实有点惨不忍睹。

研究了半天才研究出来,希望能让刚用到的朋友有点帮助。

  现在介绍使用Jmagick的使用,可以生成质量很好的缩略图,当然还有其他很多图像处理的方法。

  首先jmagick(http://www.yeo.id.au/jmagick/)是ImageMagick(http://www.imagemagick.org/)的java 应用的接口。所以要先安装ImageMagick应用程序,你的java应用才能使用,在主页上你可以轻松找到下载的链接。

  1。下载jmagick,imagemagick

  2.安装ImageMagick,网站上有安装方法(windows,unnix),我只在win上做了安装,安装以后把安装目录下所有的dll文件copy到windows/system32/目录下。

  3。下载的jmagick包含jmagick.jar,jmagick.dll文件,jmagick.dll需要copy到windows/system32/目录下。

  4。web应用如果部署到tomcat下,那么最好在catalina.bat文件中改变如下设置

setJAVA_OPTS=%JAVA_OPTS% -Xms256M -Xmx768M -XX:MaxPermSize=128M-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djava.util.logging.config.file="${catalina.base}/conf/logging.properties"

  避免heap溢出的问题,参数看你自己的机器而定。( -Xms256M -Xmx768M -XX:MaxPermSize=128M )

  5。还要注意如果部署到web应用,你在使用的class里面需要

    System.setProperty("jmagick.systemclassloader","no");

  要不然会报出UnsatisfiedLinkError: no JMagick in java.library.path.

  实例如下:


public void resize(int w, int h) throws IOException {

    try {
          // Resize
      System.setProperty("jmagick.systemclassloader","no");
          ImageInfo info = new ImageInfo(sourceFileName);
          MagickImage image = new MagickImage(info);
          MagickImage scaled = image.scaleImage(w, h);//小图片文件的大小.
          scaled.setFileName(destFile);
          scaled.writeImage(info);

        } catch(MagickApiException ex) {
              System.out.println(ex);

        } catch(MagickException ex) {
              System.out.println(ex);
        }
  }
原创粉丝点击