JMagick實(shí)現(xiàn)基本圖像處理的類實(shí)例
本文實(shí)例講述了JMagick實(shí)現(xiàn)基本圖像處理的類。分享給大家供大家參考。具體分析如下:
JMagick是一個(gè)開源API,利用JNI(Java Native Interface)技術(shù)實(shí)現(xiàn)了對(duì) ImageMagick API的Java訪問接口,因此也將比純Java實(shí)現(xiàn)的圖片操作函數(shù)在速度上要快。
/**
* 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進(jìn)行圖像處理
*/
class JMagickHandler {
private final static int DEFAULT_QUALITY = 90;
protected JMagickHandler(){}
private final static ThreadLocal<MyMagickImage> tLocal = new ThreadLocal<MyMagickImage>();
private String lastSrc = null;
/**
* 清除線程本地存儲(chǔ)信息
*/
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
}
}
希望本文所述對(duì)大家的java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Nacos與SpringBoot實(shí)現(xiàn)配置管理的開發(fā)實(shí)踐
在微服務(wù)架構(gòu)中,配置管理是一個(gè)核心組件,而Nacos為此提供了一個(gè)強(qiáng)大的解決方案,本文主要介紹了Nacos與SpringBoot實(shí)現(xiàn)配置管理的開發(fā)實(shí)踐,具有一定的參考價(jià)值2023-08-08
SpringBoot處理大量請(qǐng)求數(shù)據(jù)的傳輸問題的方法小結(jié)
在Spring?Boot項(xiàng)目常常需要中處理大量請(qǐng)求數(shù)據(jù)的傳輸問題,這篇文章主要為大家整理了一些常用的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
Java實(shí)戰(zhàn)之用Spring開發(fā)條形碼和驗(yàn)證碼
這篇文章主要介紹了Java實(shí)戰(zhàn)之用Spring開發(fā)條形碼和驗(yàn)證碼,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問題
這篇文章主要介紹了解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解
這篇文章主要介紹了SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解,因?yàn)榘咐a用到了hutool提供的DesensitizedUtil數(shù)據(jù)脫敏工具類,這里要引入hutool的依賴,如果你需要自定義 數(shù)據(jù)脫敏的邏輯,可以不引入這個(gè)依賴,需要的朋友可以參考下2024-01-01
Java增強(qiáng)for循環(huán)的增刪操作代碼
Foreach循環(huán)(Foreach loop)是計(jì)算機(jī)編程語(yǔ)言中的一種控制流程語(yǔ)句,通常用來(lái)循環(huán)遍歷數(shù)組或集合中的元素,本文通過(guò)實(shí)例演示普通for循環(huán)和foreach循環(huán)使用,java增強(qiáng)for循環(huán)的操作代碼感興趣的朋友一起看看吧2024-02-02
Mybatis generator自動(dòng)生成代碼插件實(shí)例解析
這篇文章主要介紹了Mybatis generator自動(dòng)生成代碼插件實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

