您的位置:首页 > 编程语言 > Java开发

java对图片的处理(保存和显示)(zz)

2008-10-04 23:15 357 查看
 
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图片的InputStreamsaveFile::目标文件width::目标宽度,如果不需要缩放则置0hight::目标高度,如果不需要缩放则置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图片之后中间会有一条白色的横线,不知道这是系统的缺陷还是在费用包中做的手脚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java api null
相关文章推荐