本文實例講述了JMagick實現(xiàn)基本圖像處理的類。分享給大家供大家參考。具體分析如下:
JMagick是一個開源API,利用JNI(Java Native Interface)技術(shù)實現(xiàn)了對 ImageMagick API的Java訪問接口,因此也將比純Java實現(xiàn)的圖片操作函數(shù)在速度上要快。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/** * JMagickHandler.java * * Author: Winter Lau * 2007-7-11 */ package com.eportal.img; import java.awt.Dimension; import java.io.File; import org.apache.commons.io.FileUtils; import com.gif4j.GifDecoder; import com.gif4j.GifEncoder; import com.gif4j.GifImage; import com.gif4j.GifTransformer; import dlog.common.util.StringUtils; import magick.ImageInfo; import magick.MagickException; import magick.MagickImage; /** * 使用JMagick進行圖像處理 */ class JMagickHandler { private final static int DEFAULT_QUALITY = 90 ; protected JMagickHandler(){} private final static ThreadLocal<MyMagickImage> tLocal = new ThreadLocal<MyMagickImage>(); private String lastSrc = null ; /** * 清除線程本地存儲信息 */ private synchronized MyMagickImage getMagickImage(String src) throws Exception { MyMagickImage mi = tLocal.get(); if (mi != null && StringUtils.equals(src, lastSrc)) return mi; else if (mi != null ) tLocal.remove(); this .lastSrc = src; ImageInfo info = new ImageInfo(src); mi = new MyMagickImage(info); tLocal.set(mi); return mi; } @Override public void cleanup() { MyMagickImage mi = tLocal.get(); if (mi != null ) mi.destroyImages(); tLocal.remove(); } @Override public ImageExtInfo getImageInfo(String src) throws Exception { try { MagickImage image = this .getMagickImage(src); ImageExtInfo ext = new ImageExtInfo(); Dimension dim = image.getDimension(); ext.setWidth(( int )dim.getWidth()); ext.setHeight(( int )dim.getHeight()); ext.setSize(image.sizeBlob()); ext.setAnimated(image.isAnimatedImage()); return ext; } catch (MagickException e){ return new PureJavaHandler().getImageInfo(src); } } private final static boolean hasUnicode(String str){ return str.getBytes().length != str.length(); } @Override public void resize(String src, String dest, int width, int height, int quality) throws Exception { boolean u_src = hasUnicode(src); MyMagickImage image; File srctmp = null ; if (u_src){ srctmp = File.createTempFile( "jmagick_s_" + src.hashCode(), null ); FileUtils.copyFile( new File(src), srctmp); image = this .getMagickImage(srctmp.getAbsolutePath()); } else image = this .getMagickImage(src); image.getImageInfo().setQuality((quality> 0 )?quality:DEFAULT_QUALITY); MagickImage scaledimage = null ; try { if (image.isAnimatedImage()){ GifImage gifImage = GifDecoder.decode( new File(src)); GifImage newGif = GifTransformer.resize(gifImage, width, height, false ); GifEncoder.encode(newGif, new File(dest)); } else { //others scaledimage = image.scaleImage(width, height); scaledimage.setImageFormat( "JPEG" ); scaledimage.profileImage( "*" , null ); boolean u_dest = hasUnicode(dest); if (u_dest){ File tmp = File.createTempFile( "jmagick_d_" + dest.hashCode(), null ); scaledimage.setFileName(tmp.getAbsolutePath()); scaledimage.writeImage(image.getImageInfo()); FileUtils.copyFile(tmp, new File(dest)); FileUtils.forceDelete(tmp); } else { scaledimage.setFileName(dest); scaledimage.writeImage(image.getImageInfo()); } } } finally { if (srctmp != null ) FileUtils.forceDelete(srctmp); if (scaledimage != null ) scaledimage.destroyImages(); } } @Override public void rotate(String src, String dest, double degrees) throws Exception { boolean u_src = hasUnicode(src); MyMagickImage image; File srctmp = null ; if (u_src){ srctmp = File.createTempFile( "jmagick_s_" + src.hashCode(), null ); FileUtils.copyFile( new File(src), srctmp); image = this .getMagickImage(srctmp.getAbsolutePath()); } else image = this .getMagickImage(src); try { MagickImage rotateImg = image.rotateImage(degrees); rotateImg.profileImage( "*" , null ); boolean u_dest = hasUnicode(dest); if (u_dest){ File tmp = File.createTempFile( "jmagick_d_" + dest.hashCode(), null ); rotateImg.setFileName(tmp.getAbsolutePath()); // convert to png rotateImg.writeImage(image.getImageInfo()); rotateImg.destroyImages(); FileUtils.copyFile(tmp, new File(dest)); FileUtils.forceDelete(tmp); } else { rotateImg.setFileName(dest); // convert to png rotateImg.writeImage(image.getImageInfo()); rotateImg.destroyImages(); } } finally { if (srctmp != null ) FileUtils.forceDelete(srctmp); } } private static class MyMagickImage extends MagickImage { private ImageInfo imageInfo; public ImageInfo getImageInfo() { return imageInfo; } public MyMagickImage(ImageInfo info) throws MagickException{ super (info); this .imageInfo = info; } } @Override public void cropImage(String src, int width, int height, int point, int point2, String dst) throws Exception { // TODO Auto-generated method stub } } |
希望本文所述對大家的java程序設(shè)計有所幫助。