程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> java 自動生成略縮圖示例代碼

java 自動生成略縮圖示例代碼

編輯:更多關於編程
    本篇文章,在前輩的經驗基礎上,分別對單圖生成略縮圖和批量生成略縮圖做個小結  

    當你要做一個圖庫的項目時,對圖片大小、像素的控制是首先需要解決的難題。

    一、單圖生成略縮圖
    單圖經過重新繪制,生成新的圖片。新圖可以按一定比例由舊圖縮小,也可以規定其固定尺寸。
    詳細代碼如下:

    復制代碼 代碼如下:
    <SPAN style="FONT-SIZE: 14px">import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGEncodeParam;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.util.HashMap;
    import java.util.List;
    import java.util.ArrayList;
    import java.io.File;
    import java.io.IOException;
    import java.io.FileOutputStream;
    import java.util.Map;
    public class PicChange {
        /**
         * @param im            原始圖像
         * @param resizeTimes   需要縮小的倍數,縮小2倍為原來的1/2 ,這個數值越大,返回的圖片越小
         * @return              返回處理後的圖像
         */
        public BufferedImage resizeImage(BufferedImage im, float resizeTimes) {
            /*原始圖像的寬度和高度*/
            int width = im.getWidth();
            int height = im.getHeight();
            /*調整後的圖片的寬度和高度*/
            int toWidth = (int) (Float.parseFloat(String.valueOf(width)) / resizeTimes);
            int toHeight = (int) (Float.parseFloat(String.valueOf(height)) / resizeTimes);
            /*新生成結果圖片*/
            BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
            result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
            return result;
        }
        /**
         * @param im            原始圖像
         * @param resizeTimes   倍數,比如0.5就是縮小一半,0.98等等double類型
         * @return              返回處理後的圖像
         */
        public BufferedImage zoomImage(BufferedImage im, float resizeTimes) {
            /*原始圖像的寬度和高度*/
            int width = im.getWidth();
            int height = im.getHeight();
            /*調整後的圖片的寬度和高度*/
            int toWidth = (int) (Float.parseFloat(String.valueOf(width)) * resizeTimes);
            int toHeight = (int) (Float.parseFloat(String.valueOf(height)) * resizeTimes);
            /*新生成結果圖片*/
            BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
            result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
            return result;
        }
        public boolean writeHighQuality(BufferedImage im, String fileFullPath) {
            try {
                /*輸出到文件流*/
                FileOutputStream newimage = new FileOutputStream(fileFullPath+System.currentTimeMillis()+".jpg");
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
                JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im);
                /* 壓縮質量 */
                jep.setQuality(1f, true);
                encoder.encode(im, jep);
               /*近JPEG編碼*/
                newimage.close();
                return true;
            } catch (Exception e) {
                return false;
            }
        }
        public static void main(String[] args) throws Exception{
            String inputFoler = "F:pic" ;
             /*這兒填寫你存放要縮小圖片的文件夾全地址*/
            String outputFolder = "F:picNew"; 
            /*這兒填寫你轉化後的圖片存放的文件夾*/
            float times = 0.25f;
            /*這個參數是要轉化成的倍數,如果是1就是轉化成1倍*/
            PicChange r = new PicChange();
            File ff = new File("F:picChrysanthemum1.jpg");
            BufferedImage f = javax.imageio.ImageIO.read(ff);
            r.writeHighQuality(r.zoomImage(f,times), outputFolder);

        }
    }</SPAN>


    當你把上面的代碼移至myEclipse時,可能會在引入一下工具包時出錯。

    復制代碼 代碼如下:
    <SPAN style="FONT-SIZE: 14px">import com.sun.image.codec.</SPAN>


    解 決方法:只要把Windows - Preferences - Java - Compiler - Errors/Warnings裡面的Deprecated and restricted API中的Forbidden references(access rules)選為Warning就可以編譯通過。

    二、批量生成略縮圖
    批量生成略縮圖,即將已知文件夾中後綴為.jpg 或其他圖片後綴名的文件  統一轉化後 放到 已定的另外文件夾中

    復制代碼 代碼如下:


    <SPAN style="FONT-SIZE: 14px">import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGEncodeParam;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.util.HashMap;
    import java.util.List;
    import java.util.ArrayList;
    import java.io.File;
    import java.io.IOException;
    import java.io.FileOutputStream;
    import java.util.Map;
    public class ResizeImage {
        /**
         * @param im            原始圖像
         * @param resizeTimes   需要縮小的倍數,縮小2倍為原來的1/2 ,這個數值越大,返回的圖片越小
         * @return              返回處理後的圖像
         */
        public BufferedImage resizeImage(BufferedImage im, float resizeTimes) {
            /*原始圖像的寬度和高度*/
            int width = im.getWidth();
            int height = im.getHeight();
            /*調整後的圖片的寬度和高度*/
            int toWidth = (int) (Float.parseFloat(String.valueOf(width)) / resizeTimes);
            int toHeight = (int) (Float.parseFloat(String.valueOf(height)) / resizeTimes);
            /*新生成結果圖片*/
            BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
            result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
            return result;
        }
        /**
         * @param im            原始圖像
         * @param resizeTimes   倍數,比如0.5就是縮小一半,0.98等等double類型
         * @return              返回處理後的圖像
         */
        public BufferedImage zoomImage(BufferedImage im, float resizeTimes) {
            /*原始圖像的寬度和高度*/
            int width = im.getWidth();
            int height = im.getHeight();
            /*調整後的圖片的寬度和高度*/
            int toWidth = (int) (Float.parseFloat(String.valueOf(width)) * resizeTimes);
            int toHeight = (int) (Float.parseFloat(String.valueOf(height)) * resizeTimes);
            /*新生成結果圖片*/
            BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
            result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
            return result;
        }
        /**
         * @param path  要轉化的圖像的文件夾,就是存放圖像的文件夾路徑
         * @param type  圖片的後綴名組成的數組
         * @return
        */
        public List<BufferedImage> getImageList(String path, String[] type) throws IOException{
            Map<String,Boolean> map = new HashMap<String, Boolean>();
            for(String s : type) {
                map.put(s,true);
            }
            List<BufferedImage> result = new ArrayList<BufferedImage>();
            File[] fileList = new File(path).listFiles();
            for (File f : fileList) {
                if(f.length() == 0)
                    continue;
                if(map.get(getExtension(f.getName())) == null)
                    continue;
                result.add(javax.imageio.ImageIO.read(f));
            }
            return result;
        }
        /**
         * 把圖片寫到磁盤上
          * @param im
         * @param path     eg: C://home// 圖片寫入的文件夾地址
          * @param fileName DCM1987.jpg  寫入圖片的名字
          * @return
         */
        public boolean writeToDisk(BufferedImage im, String path, String fileName) {
            File f = new File(path + fileName);
            String fileType = getExtension(fileName);
            if (fileType == null)
                return false;
            try {
                ImageIO.write(im, fileType, f);
                im.flush();
                return true;
            } catch (IOException e) {
                return false;
            }
        }
        public boolean writeHighQuality(BufferedImage im, String fileFullPath) {
            try {
                /*輸出到文件流*/
                FileOutputStream newimage = new FileOutputStream(fileFullPath+System.currentTimeMillis()+".jpg");
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
                JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im);
                /* 壓縮質量 */
                jep.setQuality(1f, true);
                encoder.encode(im, jep);
               /*近JPEG編碼*/
                newimage.close();
                return true;
            } catch (Exception e) {
                return false;
            }
        }
        /**
         * 返回文件的文件後綴名
          * @param fileName
          * @return
        */
        public String getExtension(String fileName) {
            try {
                return fileName.split(".")[fileName.split(".").length - 1];
            } catch (Exception e) {
                return null;
            }
        }
        public static void main(String[] args) throws Exception{
            String inputFoler = "F:pic" ;
             /*這兒填寫你存放要縮小圖片的文件夾全地址*/
            String outputFolder = "F:picNew"; 
            /*這兒填寫你轉化後的圖片存放的文件夾*/
            float times = 0.25f;
            /*這個參數是要轉化成的倍數,如果是1就是轉化成1倍*/
            ResizeImage r = new ResizeImage();
       List<BufferedImage> imageList = r.getImageList(inputFoler,new String[] {"jpg"});
            for(BufferedImage i : imageList) {
             r.writeHighQuality(r.zoomImage(i,times),outputFolder);
      }
        }
    }</SPAN>

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved