zoukankan      html  css  js  c++  java
  • 用于图片缩放的工具类

    网上找到的,略微地改动了一番

    大致能满足这样的需求:

    当图片长度或宽度超过一个正方形边长时,等比缩小,使图片能够放入正方形内。缩放后尽可能保持图片原先的质量。

    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGEncodeParam;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.awt.image.Kernel;
    import java.awt.image.ConvolveOp;
    import javax.swing.ImageIcon;
    
    public class ImageUtil {
    
        public static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException {
    
            if (quality > 1) {
                throw new IllegalArgumentException("Quality has to be between 0 and 1");
            }
    
            ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
            Image i = ii.getImage();
            Image resizedImage = null;
    
            // No necessary to resized small image, just copy it. --Deolin
            if (i.getWidth(null) <= newWidth && i.getHeight(null) <= newWidth) {
                int byteread = 0;
                @SuppressWarnings("resource")
                InputStream in = new FileInputStream(originalFile);
                @SuppressWarnings("resource")
                OutputStream out = new FileOutputStream(resizedFile);
                byte[] buffer = new byte[1024];
                while ((byteread = in.read(buffer)) != -1) {
                    out.write(buffer, 0, byteread);
                }
                return;
            }
    
            int iWidth = i.getWidth(null);
            int iHeight = i.getHeight(null);
    
            if (iWidth > iHeight) {
                resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH);
            } else {
                resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH);
            }
    
            // This code ensures that all the pixels in the image are loaded.
            Image temp = new ImageIcon(resizedImage).getImage();
    
            // Create the buffered image.
            BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
                    BufferedImage.TYPE_INT_RGB);
    
            // Copy image to buffered image.
            Graphics g = bufferedImage.createGraphics();
    
            // Clear background and paint the image.
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
            g.drawImage(temp, 0, 0, null);
            g.dispose();
    
            // Soften.
            float softenFactor = 0.05f;
            float[] softenArray = { 0, softenFactor, 0, softenFactor, 1 - (softenFactor * 4), softenFactor, 0, softenFactor,
                    0 };
            Kernel kernel = new Kernel(3, 3, softenArray);
            ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
            bufferedImage = cOp.filter(bufferedImage, null);
    
            // Write the jpeg to a file.
            FileOutputStream out = new FileOutputStream(resizedFile);
    
            // Encodes image as a JPEG data stream
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
    
            param.setQuality(quality, true);
    
            encoder.setJPEGEncodeParam(param);
            encoder.encode(bufferedImage);
        }
    
        public static void main(String[] args) throws IOException {
            File originalImage = new File("C:\1.bmp");
            resize(originalImage, new File("C:\thumb_1.bmp"), 250, 1f);
        }
    
    }

    示例中关键参数是newWidth 250,代表了将图片宽或高较长的那边缩放到250,另一边等比例缩放,达到能够放入250*250的正方形中的效果;

    如果图片宽高相等,则会缩放到250*250的大小。

    如果图片宽高都小于250,那么它原本就能够放入正方形,则会复制自身

    测试效果

     

  • 相关阅读:
    Redmine入门-安装
    【Spring Cloud笔记】 Eureka通过集群实现高可用
    【SpringBoot笔记】SpringBoot整合Druid数据连接池
    【Spring Cloud笔记】 断路器-hystrix
    【Spring Cloud笔记】Eureka注册中心增加权限认证
    Jenkins实现简单的CI功能
    【SpringBoot笔记】SpringBoot如何正确关闭应用
    Activi相关表归纳
    阿里云MySQL远程连接不上问题
    Storm入门-Storm与Spark对比
  • 原文地址:https://www.cnblogs.com/deolin/p/6905556.html
Copyright © 2011-2022 走看看