java
中的圖片處理是很讓人頭疼的一件事情。目前
java api
中的
imageIO
可以將
gif
圖片轉換成
png
圖片,
jpg
圖片可以正常轉換。據說
gif
轉
jpg
也是有辦法的,但是將
jpg
轉成
gif
,我費了很大的工夫才找到一個很好的解決方案。
?
首先介紹的是一段很好的縮放圖片的代碼::

public?static?BufferedImage?resize(BufferedImage?source,?int?targetW,?int?targetH)?
{
????//?targetW,targetH分別表示目標長和寬
????????int?type?=?source.getType();
????????BufferedImage?target?=?null;
????????double?sx?=?(double)?targetW?/?source.getWidth();
????????double?sy?=?(double)?targetH?/?source.getHeight();

????????//這里想實現在targetW,targetH范圍內實現等比縮放。如果不需要等比縮放
????????//則將下面的if?else語句注釋即可
????????if(sx>sy)

????????
{
????????????sx?=?sy;
????????????targetW?=?(int)(sx?*?source.getWidth());

????????}else
{
????????????sy?=?sx;
????????????targetH?=?(int)(sy?*?source.getHeight());
????????}


????????if?(type?==?BufferedImage.TYPE_CUSTOM)?
{?//handmade
????????????ColorModel?cm?=?source.getColorModel();
????????????WritableRaster?raster?=?cm.createCompatibleWritableRaster(targetW,?targetH);
????????????boolean?alphaPremultiplied?=?cm.isAlphaPremultiplied();
????????????target?=?new?BufferedImage(cm,?raster,?alphaPremultiplied,?null);
????????}?else
????????????target?=?new?BufferedImage(targetW,?targetH,?type);
????????Graphics2D?g?=?target.createGraphics();
????????//smoother?than?exlax:
????????g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,?RenderingHints.VALUE_INTERPOLATION_BICUBIC);


????????g.drawRenderedImage(source,?AffineTransform.getScaleInstance(sx,?sy));
????????g.dispose();
????????return?target;
????}

接下來是將InputStream保存為jpg文件
public?static?void?saveImageAsJpg?(InputStream?in,?File?saveFile,int?width,int?hight)????

????????????throws?Exception?
{
????????BufferedImage?srcImage;

????????srcImage?=?ImageIO.read(in);

????????if(width?>?0?||?hight?>?0)

????????
{
?????????????srcImage?=?resize(srcImage,?width,?hight);
????????}

????????ImageIO.write(srcImage,?"JPEG",?saveFile);
????????in.close();
????}

參數解釋:
in
::是一個
jpg
圖片的
InputStream
saveFile
::目標文件
width
::目標寬度,如果不需要縮放則置
0
hight
::目標高度,如果不需要縮放則置
0
?
?
然后是將
InputStream
保存為
gif
文件:
private?static?void?saveImageAsGif(InputStream?in,?File?fileToSave,int?width,?int?hight)

????????????throws?Exception?
{
????????BufferedImage?srcImage;

????????srcImage?=?ImageIO.read(in);

????????if(width>0?&&?hight?>0)

????????
{
?????????????srcImage?=?resize(srcImage,?width,?hight);
????????}

????????FileOutputStream?out?=?new?FileOutputStream(fileToSave);
????????GifEncoder?encoder?=?new?GifEncoder(srcImage,?out);
????????encoder.encode();

????????in.close();
????}

參數解釋:
in::是一個jpg或者gif圖片的InputStream
saveFile::目標文件
width::目標寬度,如果不需要縮放則置0
hight::目標高度,如果不需要縮放則置0
?
GifEncoder這個類是java api中沒有的,也是我找尋了很久的一個東西。它是Acme.JPM.Encoders.GifEncoder,只要找到這個包,將jpg轉為gif就不是問題了。
?
?
Jpg圖片使用的是24-bit的編碼,png有png-24和png-8兩種,但是gif是8-bit的編碼。如果強行將jpg圖片信息流按字節拆開,轉換成gif圖片,即使使用標準256色,也會出現嚴重的失真。
?
我曾經使用了gif4j_light_trial_1.0.jar這個包,但是這個包讓我很失望。盡管它可以將多張圖片合成一個動態的gif圖片,但是它是付費的,免費使用期只有一個月。并且,在使用它將jpg圖片轉換成gif圖片之后中間會有一條白色的橫線,不知道這是系統的缺陷還是在費用包中做的手腳。
posted on 2006-11-13 16:31
PrettyBoy 閱讀(2965)
評論(0) 編輯 收藏