JMagick實(shí)現(xiàn)基本圖像處理的類實(shí)例
本文實(shí)例講述了JMagick實(shí)現(xiàn)基本圖像處理的類。分享給大家供大家參考。具體分析如下:
JMagick是一個(gè)開(kāi)源API,利用JNI(Java Native Interface)技術(shù)實(shí)現(xiàn)了對(duì) ImageMagick API的Java訪問(wèn)接口,因此也將比純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)配置管理的開(kāi)發(fā)實(shí)踐
在微服務(wù)架構(gòu)中,配置管理是一個(gè)核心組件,而Nacos為此提供了一個(gè)強(qiáng)大的解決方案,本文主要介紹了Nacos與SpringBoot實(shí)現(xiàn)配置管理的開(kāi)發(fā)實(shí)踐,具有一定的參考價(jià)值2023-08-08SpringBoot處理大量請(qǐng)求數(shù)據(jù)的傳輸問(wèn)題的方法小結(jié)
在Spring?Boot項(xiàng)目常常需要中處理大量請(qǐng)求數(shù)據(jù)的傳輸問(wèn)題,這篇文章主要為大家整理了一些常用的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Java實(shí)戰(zhàn)之用Spring開(kāi)發(fā)條形碼和驗(yàn)證碼
這篇文章主要介紹了Java實(shí)戰(zhàn)之用Spring開(kāi)發(fā)條形碼和驗(yàn)證碼,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題
這篇文章主要介紹了解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot利用自定義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-01Java增強(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-02Mybatis generator自動(dòng)生成代碼插件實(shí)例解析
這篇文章主要介紹了Mybatis generator自動(dòng)生成代碼插件實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09java方法重寫(xiě)時(shí)需要注意的問(wèn)題
大家好,本篇文章主要講的是java方法重寫(xiě)時(shí)需要注意的問(wèn)題,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12