java压缩图片,存为本地文件

    技术2022-05-20  35

    最近的写的插件要做到,文件浏览器获得图片位置,然后压缩图片,再存为本地文件

    压缩图片很简单,关键是把ImageIcon 保存为本地图片废了好些力气

    我的解决方法是将ImageIcon 写入BufferedImage

    然后调用标准的图片保存方法: javax.imageio.ImageIO.write(bi, "JPEG", new java.io.File(lastfilename));   

    同时注意保存文件的路径问题:window下通过 getClass().getResource("/")获得的路进都是带有“file//”开头的,但是保存的时候将“file//”开头的路径作为文件名,windows下就会报错说找不到路径。把“file//”去掉解决。还会遇到路径中“/”,"/"的问题,最好把所有的“/”都过滤成"/",减少出错的几率。

    完整代码在下面:

    先从文件选择器读入图片的地址。然后传入MakeFace生成压缩图片,再返回图片的相对地址。

    JFileChooser fDialog=new JFileChooser(); //文件选择器    Frame frame=new Frame();    int result=fDialog.showOpenDialog(frame);    if(result==JFileChooser.APPROVE_OPTION){        try {                       java.lang.String fname = fDialog.getSelectedFile().getAbsolutePath();            MakeFace mf=new MakeFace(getClass().getResource("/faceimage/").toString(),fname);            image.setText(changeXie("/faceimage"+mf.getImagepath()));          //  System.out.print(changeXie("/faceimage"+mf.getImagepath()));        } catch (Exception ex) {                    }            }

    ///

    ///

     

    package com.soulnew.util;

     

    import java.awt.Graphics2D;import java.awt.Image;import javax.swing.ImageIcon;

    /** * * @author soulnew@gmail.com * @ blog:     http://souljava.blog.163.com */public class MakeFace {        String floder;    ImageIcon imageicon;    String imagepath;        public String getImagepath() {        return imagepath;    }    public ImageIcon getImageicon() {        return imageicon;    }    /*     @floder : the floder where used to save the image     @imagepath  : the image path.     */        public MakeFace(String floder,String imagepath) {        this.floder=floder;        buildimage(imagepath);        String imagename;                if(imagepath.indexOf("/")!=-1)            imagename=imagepath.substring(imagepath.lastIndexOf("/"),imagepath.indexOf("."));        else            imagename=imagepath.substring(imagepath.lastIndexOf("//"),imagepath.indexOf("."));                               this.imagepath=imagename+".jpg";         //  System.out.print("#"+this.getImagepath());        saveImage(floder+imagename+".jpg");    }            public void  buildimage(String imagepath){        ImageIcon icon = new ImageIcon(imagepath);        // scale to 64 pix in largest dimension        Image img = icon.getImage();        float factor = 1.0f;        if (img.getWidth(null) > img.getHeight(null))            factor = Math.min(64f / img.getWidth(null), 1.0f);        else            factor = Math.min(64f / img.getHeight(null), 1.0f);        Image scaledImage =                img.getScaledInstance((int) (img.getWidth(null) * factor),                (int) (img.getHeight(null) * factor),                Image.SCALE_FAST);        icon.setImage(scaledImage);        imageicon=icon;    }            public void saveImage(String filename){        try {                        java.awt.image.BufferedImage bi = new java.awt.image.BufferedImage(imageicon.getIconWidth(), imageicon.getIconHeight(), java.awt.image.BufferedImage.TYPE_INT_RGB);            java.awt.Image image = imageicon.getImage();            Graphics2D g2= (Graphics2D)bi.getGraphics();            g2.drawImage(image,0,0,null);            String temp=filename;                        String lastfilename=null;            if(temp.indexOf("file//")==-1)                lastfilename=temp.substring(temp.indexOf("file//")+7,temp.length());            lastfilename=changeSpace(lastfilename);                        javax.imageio.ImageIO.write(bi, "JPEG", new java.io.File(lastfilename));                        g2.dispose();        } catch (Exception ex) {            ex.printStackTrace();        }    }    public String changeSpace(String string){        StringBuffer sb=new StringBuffer(string);        int pos=sb.indexOf(" ");        while(pos!=-1){            sb.replace(pos, pos+3, "/u0020");            pos=sb.indexOf(" ");        }        return sb.toString();    }    public static void main(String arg[]){                MakeFace mf=new MakeFace("d:/图","C://laoma.gif");        //java.lang.System.out.print(mf.getImagepath());    }}


    最新回复(0)