- 論壇徽章:
- 0
|
java生成縮略圖代碼
引自:http://www.blogjava.net/eamoi/archive/2005/01/14/296.html
方法1:
縮略圖只要10行代碼就夠了,前面介紹過(guò)N次了.自己不能往前找找嗎?
Image src = ToolKit.getToolKit().createImage("文件路徑");
然后先生成一個(gè)BufferedImage bi作為畫布.
BufferedImage bi = new BufferedImage(目標(biāo)寬, 目標(biāo)高,BufferedImage.TYPE_INT_RGB);
得到它的Graphics對(duì)象:
Graphics g = bi.getGraphics();
然后往這個(gè)畫而上畫原圖就行了:
g.grawImage(src,0,0,目標(biāo)寬,目標(biāo)高,null);
找一個(gè)編碼類,如JPEGEncoder,GIFEncoder
把bi編碼輸出就行了.
方法2:
import javax.imageio.ImageIO;
import javax.imageio.IIOException;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.io.File;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;
public class Test {
public static void main (String argv[]) {
try {
File fi = new File("C:/1.jpg"); //大圖文件
File fo = new File("C:/2.jpg"); //將要轉(zhuǎn)換出的小圖文件
AffineTransform transform = new AffineTransform();
BufferedImage bis = ImageIO.read(fi);
int w = bis.getWidth();
int h = bis.getHeight();
double scale = (double)w/h;
int nw = 120;
int nh = (nw * h) / w;
if(nh>120) {
nh = 120;
nw = (nh * w) / h;
}
double sx = (double)nw / w;
double sy = (double)nh / h;
transform.setToScale(sx,sy);
AffineTransformOp ato = new AffineTransformOp(transform, null);
BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);
ato.filter(bis,bid);
ImageIO.write(bid, "jpeg", fo);
} catch(Exception e) {
e.printStackTrace();
}
}
}
引自:http://www.host01.com/article/jsp/00040004/057211233977302.htm
在任何一個(gè)綜合性網(wǎng)站,我們往往需要上傳一些圖片資料。但隨著高分辨率DC的普及,上傳的圖片容量
會(huì)很大,比如300萬(wàn)象素DC出來(lái)的文件基本不下 600K。為了管理方便,大家可能不愿意每次都用ACDsee
修改它,而直接上傳到服務(wù)器。但是這種做法在客戶端看來(lái)就沒(méi)有那么輕松了,對(duì)于撥號(hào)上網(wǎng)的用戶簡(jiǎn)
直是一場(chǎng)惡夢(mèng),雖然你可以在圖片區(qū)域設(shè)置wide和high!
問(wèn)題的解決之道來(lái)了!我們可以在類中處理一張大圖,并縮小它。
前提是需要JDK1.4,這樣才能進(jìn)行處理。按以下方法做:
import java.io.File;
import java.io.FileOutputStream;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class JpgTest {
public void JpgTset() throws Exception{
File _file = new File("/Order005-0001.jpg"); //讀入文件
Image src = javax.imageio.ImageIO.read(_file); //構(gòu)造Image對(duì)象
int wideth=src.getWidth(null); //得到源圖寬
int height=src.getHeight(null); //得到源圖長(zhǎng)
BufferedImage tag = new BufferedImage(wideth/2,height/2,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src,0,0,wideth/2,height/2,null); //繪制縮小后的圖
FileOutputStream out=new FileOutputStream("newfile.jpg"); //輸出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag); //近JPEG編碼
//System.out.print(width+"*"+height);
out.close();
}
}
過(guò)程很簡(jiǎn)單,從本地磁盤讀取文件Order005-0001.jpg(2032*1524),變成Image對(duì)象src,接著構(gòu)造目標(biāo)
文件tag,設(shè)置tag的長(zhǎng)寬為源圖的一半,對(duì)tag進(jìn)行編碼,輸出到文件流out,最后關(guān)閉文件流。
還有一些問(wèn)題需要說(shuō)明:
第一,目前只能支持JPG(JPEG)、GIF、PNG三種格式。
第二,對(duì)于源圖的容量有限制,最好不要超過(guò)1M,否則會(huì)拋內(nèi)存不足的錯(cuò)誤,不過(guò)我試驗(yàn)過(guò)1.8M的源圖
,可以成功,但是也很容易拋內(nèi)存不足。
引用一位前輩的話:圖象運(yùn)算本身是密集型運(yùn)算,需要大量的內(nèi)存存放象素值。我用VC試了一下,4M的
圖象也有問(wèn)題,而且越是壓縮比大的圖片在內(nèi)存中還原成 BITMAP時(shí)需要的內(nèi)存越大。解決的方法,可以
重寫編碼類,先開一定的內(nèi)存,然后一段一段編碼寫到臨時(shí)文件中,輸出的時(shí)候再一段一段讀出來(lái);
利用 nio的內(nèi)存映象來(lái)操作。JavaMail由于采用了Builder模式,先生成一個(gè)郵件的每一個(gè)部分,然后合
并成一個(gè)完整的郵件對(duì)象,這樣每個(gè)構(gòu)件都要先生成到內(nèi)存中,你如果發(fā)送一個(gè)上百兆的附件,那么在
構(gòu)造Part時(shí)肯定內(nèi)存溢出,所以我就改寫了BodyPart的構(gòu)造,讓他和一個(gè)臨時(shí)文件關(guān)聯(lián),然后用臨時(shí)文
件保存Part而不是構(gòu)造在內(nèi)存中,這樣任義大小的附件(硬盤能放得下為限)都可以發(fā)送了。
最后,如果大家對(duì)圖像處理有更高的要求,不妨關(guān)注一下開源項(xiàng)目。比如JMagick,可以使用JMagick來(lái)
實(shí)現(xiàn)圖片的復(fù)制、信息獲取、斜角、特效、組合、改變大小、加邊框、旋轉(zhuǎn)、切片、改變格式、去色等
等功能。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/24475/showart_1762341.html |
|