zoukankan      html  css  js  c++  java
  • java改变图片文件尺寸

    方式一:缩放图片(缺点:如果需要固定尺寸图片,那么会使得原图变形)

    1.单个图片尺寸处理:

    package test.common;
    
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.imageio.ImageIO;
    
    
    public class ImgTest {
        private Image img;
        private final static int WIDTH = 147;
        private final static int HEIGHT = 136;
    
        /**
         * 改变图片的大小到宽为size,然后高随着宽等比例变化
         * @param is 上传的图片的输入流
         * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
         * @param size 新图片的宽
         * @param format 新图片的格式
         * @throws IOException
         */
        public static OutputStream resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException {
            BufferedImage prevImage = ImageIO.read(is);
            double width = prevImage.getWidth();
            double height = prevImage.getHeight();
            double percent = size/width;
            int newWidth = (int)(width * percent);
            int newHeight = (int)(height * percent);
            BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);
            Graphics graphics = image.createGraphics();
            graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);
            ImageIO.write(image, format, os);
            os.flush();
            is.close();
            os.close();
            ByteArrayOutputStream b = (ByteArrayOutputStream) os;
            return os;
        }
        
        public static void main(String[] args) {
            try {
                InputStream is = new FileInputStream(new File("download/qrcode_test.jpg"));
                OutputStream os = new FileOutputStream(new File("download/qrcode_test_1.jpg"));
                resizeImage(is, os, 10, "png");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }

    2.批量图片尺寸处理:

    package com.test;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.LinkedHashMap;
    
    import javax.imageio.ImageIO;
    public class ImgChange {
            private Image img;
            private final static int WIDTH = 147;
            private final static int HEIGHT = 136;
    
            /**
             * 改变图片的大小到宽为size,然后高随着宽等比例变化
             * @param is 上传的图片的输入流
             * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
             * @param size 新图片的宽
             * @param format 新图片的格式
             * @throws IOException
             */
            public static OutputStream resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException {
                BufferedImage prevImage = ImageIO.read(is);
                double width = prevImage.getWidth();
                double height = prevImage.getHeight();
                int newWidth = 600;
                int newHeight = 800;
                BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);
                Graphics graphics = image.createGraphics();
                graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);
                ImageIO.write(image, format, os);
                os.flush();
                is.close();
                os.close();
                //ByteArrayOutputStream b = (ByteArrayOutputStream) os;
                return os;
            }
            
            /**
             * 读取某个目录下所有文件、文件夹
             * @param path
             * @return LinkedHashMap<String,String>
             */
            public static LinkedHashMap<String,String> getFiles(String path) {
                LinkedHashMap<String,String> files = new LinkedHashMap<String,String>();
                File file = new File(path);
                File[] tempList = file.listFiles();
         
                for (int i = 0; i < tempList.length; i++) {
                    if (!tempList[i].isDirectory()) {
                        files.put(tempList[i].getName(),tempList[i].getPath());
                    }
                }
                return files;
            }
            
            public static void main(String[] args) {
                try {
                    LinkedHashMap<String,String> files = getFiles("D:/img");
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                    Date beginDate = new Date(); 
                    System.out.println("开始:"+sdf.format(beginDate));
                    for (String fileName : files.keySet()) {
                        InputStream is = new FileInputStream(new File(files.get(fileName)));
                        OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+fileName));
                        resizeImage(is, os, 10, "jpg");
                    }
                    Date endDate = new Date(); 
                    System.out.println("结束:"+sdf.format(endDate));
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    }

     方式二:裁剪图片(缺点:可能会使得图片展示不完全,只能取到图片中间部分的内容)

    package com.test;
    
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.imageio.ImageIO;
    
    public class ImgCrop {
    
        /**
         * 改变图片的大小到宽为size,然后高随着宽等比例变化
         * @param is 上传的图片的输入流
         * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
         * @param size 新图片的宽
         * @param format 新图片的格式
         * @throws IOException
         */
        public static OutputStream resizeImage(BufferedImage bufferedimage,int widht,int height,OutputStream os, String format) throws IOException {
            BufferedImage image = new BufferedImage(widht, height, BufferedImage.TYPE_INT_BGR);
            Graphics graphics = image.createGraphics();
            graphics.drawImage(bufferedimage, 0, 0, widht, height, null);
            ImageIO.write(image, format, os);
            os.flush();
            os.close();
            return os;
        }
        
        
    /**
     * * 裁剪图片方法 * 
     * @param bufferedImage 图像源 * 
     * @param startX 裁剪开始x坐标 * 
     * @param startY 裁剪开始y坐标 * 
     * @param endX 裁剪结束x坐标 * 
     * @param endY 裁剪结束y坐标 * 
     * @return
     */
    public static BufferedImage cropImage(BufferedImage Image, int startX, int startY, int endX, int endY) {
        int width = Image.getWidth();
        int height = Image.getHeight();
        if (startX == -1) {
            startX = 0;
        }
        if (startY == -1) {
            startY = 0;
        }
        if (endX == -1) {
            endX = width - 1;
        }
        if (endY == -1) {
            endY = height - 1;
        }
        BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4);
        for (int x = startX; x < endX; ++x) {
            for (int y = startY; y < endY; ++y) {
                int rgb = Image.getRGB(x, y);
                result.setRGB(x - startX, y - startY, rgb);
            }
        }
        return result;
    }
    
        
        public static void main(String[] args) throws IOException {
            //原始图片路径
            String imagePath = "D:/image";
            File imageFile = new File(imagePath);
            File[] imageFiles = imageFile.listFiles();
            for (File fimage : imageFiles) {
                BufferedImage bufferedimage=ImageIO.read(fimage); 
                int width = bufferedimage.getWidth(); 
                int height = bufferedimage.getHeight();
                        
                OutputStream os = new FileOutputStream(new File("D:/img/"+fimage.getName()));
                resizeImage(bufferedimage,width,height,os,"jpg");
                os.flush();
                os.close();
            }
        
            //过程图片路径
            String path = "D:/img";
            dealImg(path);
            
            String cachePath = "D:/imgCache";
            File file = new File(cachePath);
            File[] files = file.listFiles();
            while(files.length>0) {
                dealImg(cachePath);
                file = new File(path);
                files = file.listFiles();
            }
        }
        
        /**
         * 处理图片
         * @param path 文件夹路径
         */
        private static void dealImg(String path) {
            try {
                File file = new File(path);
                File[] files = file.listFiles();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                Date beginDate = new Date(); 
                System.out.println(path+"begin:"+sdf.format(beginDate));
                for (File f : files) {
                    BufferedImage bufferedimage=ImageIO.read(f); 
                    Double width = (double) bufferedimage.getWidth(); 
                    Double height = (double) bufferedimage.getHeight();
                    if (width<900||height<1200) {
                        while (width<900||height<1200) {
                            width=width*1.1;
                            height=height*1.1;
                        }
                        OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName()));
                        resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg");
                        f.delete();
                        os.flush();
                        os.close();
                           continue;
                    }
                    //目标将图片裁剪成 宽900,高1200 
                    if (width > 900) { 
                        /*开始x坐标 开始y坐标 结束x坐标 结束y坐标*/ 
                        bufferedimage=cropImage(bufferedimage,(int) ((width - 900) / 2),0,(int) (width - (width-900) / 2),height.intValue()); 
                        if (height > 1200) { 
                            bufferedimage=cropImage(bufferedimage,0,(int) ((height - 1200) / 2),900,(int) (height - (height - 1200) / 2) ); 
                        } 
                    }else{ 
                        if (height > 1200) { 
                            bufferedimage=cropImage(bufferedimage,0,(int) ((height - 1200) / 2),width.intValue(),(int) (height - (height - 1200) / 2) ); 
                        } 
                    } 
                    OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+f.getName()));
                    ImageIO.write(bufferedimage, "jpg", os); //输出裁剪图片
                    f.delete();
                    os.flush();
                    os.close();
                }
                Date endDate = new Date(); 
                System.out.println(path+"end:"+sdf.format(endDate));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

     裁剪图片优化版:

    package com.jeecg.util;
    
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.imageio.ImageIO;
    
    public class ImgCrop {
    
        /**
         * 改变图片的大小到宽为size,然后高随着宽等比例变化
         * @param is 上传的图片的输入流
         * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
         * @param size 新图片的宽
         * @param format 新图片的格式
         * @throws IOException
         */
        public static OutputStream resizeImage(BufferedImage bufferedimage,int widht,int height,OutputStream os, String format) throws IOException {
            BufferedImage image = new BufferedImage(widht, height, BufferedImage.TYPE_INT_BGR);
            Graphics graphics = image.createGraphics();
            graphics.drawImage(bufferedimage, 0, 0, widht, height, null);
            ImageIO.write(image, format, os);
            os.flush();
            os.close();
            return os;
        }
        
        
    /**
     * * 裁剪图片方法 * 
     * @param bufferedImage 图像源 * 
     * @param startX 裁剪开始x坐标 * 
     * @param startY 裁剪开始y坐标 * 
     * @param endX 裁剪结束x坐标 * 
     * @param endY 裁剪结束y坐标 * 
     * @return
     */
    public static BufferedImage cropImage(BufferedImage Image, int startX, int startY, int endX, int endY) {
        int width = Image.getWidth();
        int height = Image.getHeight();
        if (startX == -1) {
            startX = 0;
        }
        if (startY == -1) {
            startY = 0;
        }
        if (endX == -1) {
            endX = width - 1;
        }
        if (endY == -1) {
            endY = height - 1;
        }
        BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4);
        for (int x = startX; x < endX; ++x) {
            for (int y = startY; y < endY; ++y) {
                int rgb = Image.getRGB(x, y);
                result.setRGB(x - startX, y - startY, rgb);
            }
        }
        return result;
    }
    
        
        public static void main(String[] args) throws IOException {
            totalImg(300,400);
        }
    
        /**
         *    所有图片调用总方法
         */
        public static void totalImg(Integer wid,Integer hei) throws IOException, FileNotFoundException {
            File file1 = new File("D:/image/");
            if (!file1.exists()) {
                file1.mkdirs();
            }
            File file2 = new File("D:/img/");
            if (!file2.exists()) {
                file2.mkdirs();
            }
            File file3 = new File("D:/imgCache/");
            if (!file3.exists()) {
                file3.mkdirs();
            }
            File file4 = new File("D:/imgCopy/");
            if (!file4.exists()) {
                file4.mkdirs();
            }
            //原始图片路径
            String imagePath = "D:/image";
            File imageFile = new File(imagePath);
            File[] imageFiles = imageFile.listFiles();
            for (File fimage : imageFiles) {
                BufferedImage bufferedimage=ImageIO.read(fimage); 
                int width = bufferedimage.getWidth(); 
                int height = bufferedimage.getHeight();
                        
                OutputStream os = new FileOutputStream(new File("D:/img/"+fimage.getName()));
                resizeImage(bufferedimage,width,height,os,"jpg");
                os.flush();
                os.close();
            }
        
            //过程图片路径
            String path = "D:/img";
            dealImg(path,wid,hei,1);
            
            String cachePath = "D:/imgCache";
            File file = new File(cachePath);
            File[] files = file.listFiles();
            while(files.length>0) {
                dealImg(cachePath,wid,hei,2);
                file = new File(path);
                files = file.listFiles();
            }
        }
        
        /**
         * 处理图片
         * @param path 文件夹路径
         */
        private static void dealImg(String path,Integer wid,Integer hei,Integer type) {
            try {
                File file = new File(path);
                File[] files = file.listFiles();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                Date beginDate = new Date(); 
                System.out.println(path+"begin:"+sdf.format(beginDate));
                for (File f : files) {
                    BufferedImage bufferedimage=ImageIO.read(f); 
                    Double width = (double) bufferedimage.getWidth(); 
                    Double height = (double) bufferedimage.getHeight();
                    
                    Double w = 0.00;
                    Double h = 0.00;
                    if (type==1) {
                        if (width<wid||height<hei) {
                            while (width<wid||height<hei) {
                                width=width*1.1;
                                height=height*1.1;
                            }
                            OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName()));
                            resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg");
                            f.delete();
                            os.flush();
                            os.close();
                               continue;
                        }else if (width>wid&&height>hei) {
                            while (width>wid&&height>hei) {
                                width=width*0.9;
                                height=height*0.9;
                                
                                if (width<wid||height<hei) {
                                    if (width<=height) {
                                        w = wid.doubleValue();
                                        h = ((wid-width)/wid)*height+height;
                                    }else{
                                        h = hei.doubleValue();
                                        w = ((hei-height)/hei)*width+width;
                                    }                                
                                }else{
                                    w = width;
                                    h = height;
                                }
                            }
                            width = w;
                            height = h;
                            OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName()));
                            resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg");
                            f.delete();
                            os.flush();
                            os.close();
                               continue;
                        }
                    }
                    
                    //目标将图片裁剪成 宽900,高1200 
                    if (width > wid) { 
                        /*开始x坐标 开始y坐标 结束x坐标 结束y坐标*/ 
                        bufferedimage=cropImage(bufferedimage,(int) ((width - wid) / 2),0,(int) (width - (width-wid) / 2),height.intValue()); 
                        if (height > hei) { 
                            bufferedimage=cropImage(bufferedimage,0,(int) ((height - hei) / 2),wid,(int) (height - (height - hei) / 2) ); 
                        } 
                    }else{ 
                        if (height > hei) { 
                            bufferedimage=cropImage(bufferedimage,0,(int) ((height - hei) / 2),width.intValue(),(int) (height - (height - hei) / 2) ); 
                        } 
                    } 
                    OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+f.getName()));
                    ImageIO.write(bufferedimage, "jpg", os); //输出裁剪图片
                    f.delete();
                    os.flush();
                    os.close();
                }
                Date endDate = new Date(); 
                System.out.println(path+"end:"+sdf.format(endDate));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    元素的隐藏和显示
    dateformat-参数表
    HTTP缓存控制小结
    Shell 快捷键
    PHP中的cURL库
    选择排序法
    双系统重装windows后如何恢复ubuntu启动项
    dell 3420 独立显卡黄色感叹号不能用问题
    YUY数据转换为RGB数据,并进行灰度化处理显示
    ubuntu 15.04安装显卡驱动,出现登录界面闪烁得解决方案(dell 3420 )
  • 原文地址:https://www.cnblogs.com/shuilangyizu/p/6018890.html
Copyright © 2011-2022 走看看