JMagick示例
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[i].getRed() + ", " + ppArray[i].getGreen()
// + ", " + ppArray[i].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[i] = 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);
}
}
}
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[i].getRed() + ", " + ppArray[i].getGreen()
// + ", " + ppArray[i].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[i] = 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);
}
}
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);
}
}