發表於 程式分享

java產生縮圖-為了清晰度

之前文章java產生縮圖
但清晰度不佳,又調整了一版,
清晰度變好,但檔案size也變大了~

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
...

public void change2SmallImg_h(String fromImgPath, String destImgPath, String imgType, int maxHeight) {
        try {
            File fiBig = new File(fromImgPath);
            BufferedImage bis = ImageIO.read(fiBig);
            
            //原?的高?
            int w = bis.getWidth();
            int h = bis.getHeight();            
            //?放
            int nowHeight = maxHeight;
            int nowWidth = (nowHeight * w) / h;            
            changeImg(fiBig, destImgPath, imgType, nowWidth, nowHeight);
        } catch (Exception e) {
            e.printStackTrace();
        }
}
    
public void change2SmallImg_w(String fromImgPath, String destImgPath, String imgType, int maxWidth) {
        try {
            File fiBig = new File(fromImgPath);
            BufferedImage bis = ImageIO.read(fiBig);
            
            //原?的高?
            int w = bis.getWidth();
            int h = bis.getHeight();
            //?放
            int nowWidth = maxWidth;
            int nowHeight = (nowWidth * h) / w;
            changeImg(fiBig, destImgPath, imgType, nowWidth, nowHeight);
        } catch (Exception e) {
            e.printStackTrace();
        }
}
    
private boolean changeImg(File fiBig, String destImgPath, String imgType, int nowWidth, int nowHeight) {
    try {
        if (imgType.compareToIgnoreCase("png") == 0 || imgType.compareToIgnoreCase("gif") == 0){
                BufferedImage to= new BufferedImage(nowWidth, nowHeight, BufferedImage.TYPE_INT_RGB); 
                Graphics2D g2d = to.createGraphics(); 
                to = g2d.getDeviceConfiguration().createCompatibleImage(nowWidth, nowHeight, Transparency.TRANSLUCENT); 
                g2d.dispose(); 
                
                g2d = to.createGraphics(); 
                BufferedImage bis = ImageIO.read(fiBig);
                Image from = bis.getScaledInstance(nowWidth, nowHeight, Image.SCALE_AREA_AVERAGING); 
                g2d.drawImage(from, 0, 0, null);
                g2d.dispose(); 
                
                ImageIO.write(to, imgType, new File(destImgPath));
            } else {                
                BufferedImage tag = new BufferedImage(nowWidth, nowHeight, BufferedImage.TYPE_INT_RGB);
                Image img = ImageIO.read(fiBig);
                tag.getGraphics().drawImage(img.getScaledInstance(nowWidth, nowHeight, Image.SCALE_SMOOTH), 
                                            0, 0, null);
                /* only JDK 8.0,若JDK8以下,只能用下面這一段
                FileOutputStream out = new FileOutputStream(destImgPath);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
                jep.setQuality(1f, true);
                encoder.encode(tag, jep);
                out.close();*/
                
                // Image writer
                JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix(imgType).next();
                FileOutputStream fos = new FileOutputStream(destImgPath);
                ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
                imageWriter.setOutput(ios);
             
                //and metadata
                IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(tag), null);

                int dpi = 96;   
                //new metadata
                Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
                Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
                for (int i = 0; i < jfif.getAttributes().getLength(); i++) {
                    Node attribute = jfif.getAttributes().item(i);
                    System.out.println(attribute.getNodeName() + "=" + attribute.getNodeValue());
                }
                jfif.setAttribute("Xdensity", Integer.toString(dpi));
                jfif.setAttribute("Ydensity", Integer.toString(dpi));
                imageMetaData.setFromTree("javax_imageio_jpeg_image_1.0", tree);

                // new Compression
                JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
                jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
                jpegParams.setCompressionQuality(1.0f);
                
                //new Write and clean up
                imageWriter.write(imageMetaData, new IIOImage(tag, null, imageMetaData), jpegParams);
                ios.close();
                imageWriter.dispose();
            }
        return true;
    } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
}

發表留言