请教java图片处理 
      把一张图片压缩成A4大小,72dpi,黑白??其中72dpi不明白什么意思?网上搜索了下说一英寸的点数?说的很抽象,大家有现成的,或者相关的例子参考吗?谢谢。

解决方案 »

  1.   

    dpi应该是类似分辨率之类的吧,个人认为不要管这个概念,就把它压缩成相应的分辨率图片就行了.
      

  2.   

    dpi是针对于输出设备而言的,指输出分辨率,dots per inch,就是点/英寸,每英寸点越多自然越清楚,就你这而言是一英寸有72个点,给你个例子,自己改改吧:import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;import javax.imageio.ImageIO;import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGEncodeParam;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;public class PicCompression {
        private int wideth;
        private int height;
        private String t = null;    public void setT(String t) {
            this.t = t;
        }    public void setWideth(int wideth) {
            // wideth=320;
            this.wideth = wideth;
        }    public int getWideth() {
            return this.wideth;
        }    public void setHeight(int height) {
            // height=240;
            this.height = height;
        }    public int getHeight(int w, int h) // former images size
        {
            // int hhh;
            if (w > wideth) {
                float ww;
                ww = (float) w / (float) wideth;
                float hh = h / ww;
                return (int) hh;
            } else {
                this.setWideth(w);
                return h;
            }    }    public void proce(String fpath) throws Exception {
            File _file = new File(fpath);
            Image src = javax.imageio.ImageIO.read(_file);
            int wideth = src.getWidth(null);
            int height = src.getHeight(null);
            int h = this.getHeight(wideth, height);
            BufferedImage tag = new BufferedImage(this.getWideth(), h,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(src, 0, 0, this.getWideth(), h, null);
            if (t != null) {
                g.setColor(new Color(242, 242, 242));
                g.fillRect(this.getWideth() - 120, h - 18, 120, 18);
                g.setColor(new Color(180, 180, 180));
                g.drawRect(this.getWideth() - 120, h - 18, 119, 17);
                g.setColor(new Color(255, 102, 0));
                g.drawString(t, this.getWideth() - 100, h - 5);
            }
            FileOutputStream out = new FileOutputStream(fpath);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
            out.close();
        }    /**
        * 压缩图片方法
        * 
        * @param oldFile
        *            将要压缩的图片
        * @param width
        *            压缩宽
        * @param height
        *            压缩长
        * @param quality
        *            压缩清晰度 <b>建议为1.0</b>
        * @param smallIcon
        *            压缩图片后,添加的扩展名
        * @return
        */
        public String proce1(String oldFile, int width, int height, float quality,
                String smallIcon) {
            if (oldFile == null) {
                return null;
            }
            String newImage = null;
            try {
                File file = new File(oldFile);
                if(!file.exists()) //文件不存在时
                    return null;
                /** 对服务器上的临时文件进行处理 */
                Image srcFile = ImageIO.read(file);
                // 为等比缩放计算输出的图片宽度及高度
                double rate1 = ((double) srcFile.getWidth(null)) / (double) width
                        + 0.1;
                double rate2 = ((double) srcFile.getHeight(null)) / (double) height
                        + 0.1;
                double rate = rate1 > rate2 ? rate1 : rate2;
                int new_w = (int) (((double) srcFile.getWidth(null)) / rate);
                int new_h = (int) (((double) srcFile.getHeight(null)) / rate);
                /** 宽,高设定 */
                BufferedImage tag = new BufferedImage(new_w, new_h,
                        BufferedImage.TYPE_INT_RGB);
                tag.getGraphics().drawImage(srcFile, 0, 0, new_w, new_h, null);
                String filePrex = oldFile.substring(0, oldFile.indexOf('.'));
                /** 压缩后的文件名 */
                // newImage =smallIcon + filePrex
                // +oldFile.substring(filePrex.length());
                newImage = filePrex + smallIcon
                        + oldFile.substring(filePrex.length());
                // newImage = smallIcon;
                /** 压缩之后临时存放位置 */
                FileOutputStream out = new FileOutputStream(newImage);            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
                /** 压缩质量 */
                jep.setQuality(quality, true);
                encoder.encode(tag, jep);            out.close();
                srcFile.flush();        } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return newImage;
        }    //
        public static void main(String str[]) {
            PicCompression ps = new PicCompression();
            try {
                System.out.println(ps.proce1("D:/My Documents/My Pictures/5.jpg",
                        640, 480, 1, "1"));
                System.out.println(ps.proce1("D:/My Documents/My Pictures/5.jpg",
                        240, 240, 1, "2"));
                System.out.print("成功哦");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
      

  3.   

    经过测试,发现相同大小的情况下,压缩比不及windows自带的“画图”工具,有什么地方可以改进的不?谢谢。