java 等比例缩略图

网上收了好几篇关于图像缩放的java文章, 都有明显的算法错误,大体思路倒是对的,细节决定成败!都是常规逻辑,根本就不考虑特殊情况,例如超扁等长条图片,明显处理都是错误的,正确的代码如下:

 

 

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

 

import javax.imageio.ImageIO;

 

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

 

public class Thumbnail {

    /**

     * 创建图片缩略图(等比缩放)

     * 

     * @param src

     *            源图片文件完整路径

     * @param dist

     *            目标图片文件完整路径

     * @param width

     *            缩放的宽度

     * @param height

     *            缩放的高度

     */

    public static void createThumbnail(String src, String dist, float width,

            float height) {

        try {

            File srcfile = new File(src);

            if (!srcfile.exists()) {

                System.out.println("文件不存在");

                return;

            }

            BufferedImage image = ImageIO.read(srcfile);

 

            // 获得缩放的比例

            double ratio = 1.0;

          // 判断如果高、宽都不大于设定值,则不处理,按变化率大的来缩放

          if (image.getHeight() > height || image.getWidth() > width) 

          {

     double ratiox = width / image.getWidth();

     double ratioy = height / image.getHeight();

     if(ratiox<ratioy)

     ratio = ratiox;

     else

     ratio = ratioy;

          }

 

            // 计算新的图面宽度和高度

            int newWidth = (int) (image.getWidth() * ratio);

            int newHeight = (int) (image.getHeight() * ratio);

 

            BufferedImage bfImage = new BufferedImage(newWidth, newHeight,

                    BufferedImage.TYPE_INT_RGB);

            bfImage.getGraphics().drawImage(

                    image.getScaledInstance(newWidth, newHeight,

                            Image.SCALE_SMOOTH), 0, 0, null);

 

            FileOutputStream os = new FileOutputStream(dist);

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);

            encoder.encode(bfImage);

            os.close();

 

            System.out.println("创建缩略图成功");

        } catch (Exception e) {

            System.out.println("创建缩略图发生异常" + e.getMessage());

        }

    }

 

    public static void main(String[] args) {

        createThumbnail("D:\\My Documents\\My Pictures\\goshopping.jpg", "D:\\My Documents\\My Pictures\\a.png", 300, 400);

        createThumbnail("D:\\My Documents\\My Pictures\\goshopping.jpg", "D:\\My Documents\\My Pictures\\b.png", 1400, 200);

        createThumbnail("D:\\My Documents\\My Pictures\\goshopping.jpg", "D:\\My Documents\\My Pictures\\c.png", 200, 1200);

    }

 

}

你可能感兴趣的:(java)