http://www.i5a6.com/?p=142
在做pdf文档转成jpg的时候,发现了Jmagick的创建高质量的图片的一个java类库,自己以前使用另外的一个类库,感觉这个更好点,就试着用了下,感觉不错
1.使用的windows下的jmagick-win-6.3.9-Q16.zip 地址是:http://downloads.jmagick.org/6.3.9/
2.doc对应的api地址:http://downloads.jmagick.org/jmagick-doc/
3.安装ImageMagick,官方网站:http://www.imagemagick.org/
我使用的是:ImageMagick-6.4.6-4-Q16-windows-dll.exe :点击下载
4. 安装ImageMagick-6.4.6-4-Q16-windows-dll.exe,将 安装目录下(按自己所安装的目录找) 下的所有dll文件 copy 到系统盘下的 “C:\WINDOWS\system32\”文件夹里
5. 配置环境变量 再环境变量path里添加新的值 “C:\Program Files\ImageMagick-6.4.6-4-Q16“使用IDE可以不用配置
6.解压jmagick-win-6.3.9-Q16.zip 将 jmagick.dll 复制到系统盘下的 “C:\WINDOWS\system32\”文件夹里 和 复制到jdk的bin(例“D:\jdk6\bin”)文件里各一份 将 jmagick.jar 复制到Tomcat下的lib文件夹里 和 所使用项目的WEB-INF下lib文件里 各一份
7.web应用如果部署到tomcat下,那么最好在catalina.bat文件中改变如下设置 set JAVA_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 )
8.还要注意如果部署到web应用,你在使用的class里面需要 System.setProperty(“jmagick.systemclassloader”,”no”); 要不然会报出UnsatisfiedLinkError: no JMagick in java.library.path. 实例测试code:
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
package
com.utils
;
import
magick.ImageInfo
;
import
magick.MagickApiException
;
import
magick.MagickException
;
import
magick.MagickImage
;
public
class
Treamspdf {
public
static
void
main(
String
[
]
args)
{
resetsize(
"E:/mylearn/workspace/TTPDF/src/com/utils/http_imgload.jpg"
,"new.jpg"
)
;
}
public
static
void
resetsize(
String
picFrom,String
picTo)
{
try
{
ImageInfo info=
new
ImageInfo(
picFrom)
;
MagickImage image=
new
MagickImage(
new
ImageInfo(
picFrom)
)
;
MagickImage scaled=
image.scaleImage
(
120
, 97
)
;
scaled.setFileName
(
picTo)
;
scaled.writeImage
(
info)
;
}
catch
(
MagickApiException ex)
{
ex.printStackTrace
(
)
;
}
catch
(
MagickException ex)
{
ex.printStackTrace
(
)
;
}
}
}
常用的水印,切图,压缩等简单程序工具类,继续下面
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package
com.utils
;
import
java.awt.Dimension
;
import
java.awt.Rectangle
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
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
Aa {
static
{
//不能漏掉这个,不然jmagick.jar的路径找不到
System
.setProperty
(
"jmagick.systemclassloader"
,"no"
)
;
}
/**
* 压缩图片
* @param filePath 源文件路径
* @param toPath 缩略图路径
*/
public
static
void
createThumbnail(
String
filePath, String
toPath)
throws
MagickException{
ImageInfo info =
null
;
MagickImage image =
null
;
Dimension
imageDim =
null
;
MagickImage scaled =
null
;
try
{
info =
new
ImageInfo(
filePath)
;
image =
new
MagickImage(
info)
;
imageDim =
image.getDimension
(
)
;
int
wideth =
imageDim.width
;
int
height =
imageDim.height
;
if
(
wideth >
height)
{
height =
660
*
height /
wideth;
wideth =
660
;
}
scaled =
image.scaleImage
(
wideth, height)
;
//小图片文件的大小.
scaled.setFileName
(
toPath)
;
scaled.writeImage
(
info)
;
}
finally
{
if
(
scaled !=
null
)
{
scaled.destroyImages
(
)
;
}
}
}
/**
* 水印(图片logo)
* @param filePath 源文件路径
* @param toImg 修改图路径
* @param logoPath logo图路径
* @throws MagickException
*/
public
static
void
initLogoImg(
String
filePath, String
toImg, String
logoPath)
throws
MagickException {
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
;
if
(
width >
660
)
{
height =
660
*
height /
width;
width =
660
;
}
sImage =
fImage.scaleImage
(
width, height)
;
fLogo =
new
MagickImage(
new
ImageInfo(
logoPath)
)
;
logoDim =
fLogo.getDimension
(
)
;
int
lw =
width /
8
;
int
lh =
logoDim.height
*
lw /
logoDim.width
;
sLogo =
fLogo.scaleImage
(
lw, lh)
;
sImage.compositeImage
(
CompositeOperator.AtopCompositeOp
, sLogo, width-
(
lw +
lh/
10
)
, height-
(
lh +
lh/
10
)
)
;
sImage.setFileName
(
toImg)
;
sImage.writeImage
(
info)
;
}
finally
{
if
(
sImage !=
null
)
{
sImage.destroyImages
(
)
;
}
}
}
/**
* 水印(文字)
* @param filePath 源文件路径
* @param toImg 修改图路径
* @param text 名字(文字内容自己随意)
* @throws MagickException
*/
public
static
void
initTextToImg(
String
filePath, String
toImg, String
text)
throws
MagickException{
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
wideth =
imageDim.width
;
int
height =
imageDim.height
;
if
(
wideth >
660
)
{
height =
660
*
height /
wideth;
wideth =
660
;
}
int
a =
0
;
int
b =
0
;
String
[
]
as =
text.split
(
""
)
;
for
(
String
string :
as)
{
if
(
string.matches
(
"[\u
4E00-\u
9FA5]"
)
)
{
a++;
}
if
(
string.matches
(
"[a-zA-Z0-9]"
)
)
{
b++;
}
}
int
tl =
a*
12
+
b*
6
+
300
;
MagickImage scaled =
aImage.scaleImage
(
wideth, height)
;
if
(
wideth >
tl &
#038;&
height >
5
)
{
DrawInfo aInfo =
new
DrawInfo(
info)
;
aInfo.setFill
(
PixelPacket.queryColorDatabase
(
"white"
)
)
;
aInfo.setUnderColor
(
new
PixelPacket(
0
,0
,0
,100
)
)
;
aInfo.setPointsize
(
12
)
;
//解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑
String
fontPath =
"C:/WINDOWS/Fonts/MSYH.TTF"
;
// String fontPath = "/usr/maindata/MSYH.TTF";
aInfo.setFont
(
fontPath)
;
aInfo.setTextAntialias
(
true
)
;
aInfo.setOpacity
(
0
)
;
aInfo.setText
(
" "
+
text +
"于 "
+
new
SimpleDateFormat
(
"yyyy-MM-dd"
)
.format
(
new
Date
(
)
)
+
" 上传于XXXX网,版权归作者所有!"
)
;
aInfo.setGeometry
(
"+"
+
(
wideth-
tl)
+
"+"
+
(
height-
5
)
)
;
scaled.annotateImage
(
aInfo)
;
}
scaled.setFileName
(
toImg)
;
scaled.writeImage
(
info)
;
scaled.destroyImages
(
)
;
}
/**
* 切图
* @param imgPath 源图路径
* @param toPath 修改图路径
* @param w
* @param h
* @param x
* @param y
* @throws MagickException
*/
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
(
)
;
}
}
}
}
Tags: java , jmagick