Java壓縮或放大圖像處理

d6nd 9年前發布 | 4K 次閱讀 Java

大量的圖片如何統一處理成固定寬度、或者固定長寬的圖片,java中的java.awt包下面的一些類就可以實現圖片處理的功能,下面就是自己寫的一個簡單的實例

 

下面的類是單張圖片的處理,里面的參數含義可以參照參數命名:

     /*   
     @Description: 壓縮或放大圖像處理 
     */
package cn.lulei.image.deal;

import java.awt.Color;  
import java.awt.Font;  
import java.awt.Graphics2D;  
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 DealImage {  

    private File file = null;  
    private String inputDir;  
    private String outputDir;  
    private String inputFileName;  
    private String outputFileName;  
    private int outputWidth;  
    private int outputHeight;  
    private boolean proportion;//是否等比壓縮  

    public DealImage() {  
        this.inputDir = "";  
        this.outputDir = "";  
        this.inputFileName = "";  
        this.outputFileName = "";  
        this.outputHeight = 200;  
        this.outputWidth = 200;  
        this.proportion = true;  
    }  

    public void setInputDir(String inputDir){  
        this.inputDir = inputDir;  
    }  
    public void setOutputDir(String outputDir){  
        this.outputDir = outputDir;  
    }  
    public void setInputFileName(String inputFileName){  
        this.inputFileName = inputFileName;  
    }  
    public void setOutputFileName(String outputFileName){  
        this.outputFileName = outputFileName;  
    }  
    public void setWidthAngHeight(int outputWidth, int outputHeight){  
        this.outputWidth = outputWidth;  
        this.outputHeight = outputHeight;  
    }  

    /** 
     * @param isVip 
     * @Date: 2013-8-7   
     * @Author: lulei   
     * @Description:處理圖片 
     */  
    private void dealImage(boolean isVip) {  
        try {  
            this.file = new File(this.inputDir + this.inputFileName);  
            if (!this.file.exists()){  
                return;  
            }  
            Image img = ImageIO.read(this.file);  
            if (img.getWidth(null) == -1) {  
                return;  
            }  
            int[] widthAndHeight = this.getNewWidthAndHeight(img);  
            BufferedImage bufferedImage = new BufferedImage(widthAndHeight[0], widthAndHeight[1], BufferedImage.TYPE_INT_RGB);  
            Graphics2D g = bufferedImage.createGraphics();  
            g.drawImage(img.getScaledInstance(widthAndHeight[0], widthAndHeight[1], Image.SCALE_SMOOTH), 0, 0, null);  
            if (!isVip) {  
                g.setFont(new Font("楷體", Font.ITALIC, 14));  
                g.setColor(Color.getHSBColor(1.0f, 0.3f, 1.0f));  
                g.drawString("想要添加的水印", widthAndHeight[0]/3, widthAndHeight[1]/2);  
            }  
            File fileOut = new File(this.outputDir);  
            if (!fileOut.exists()) {  
                fileOut.mkdirs();  
            }  
            FileOutputStream fileOutputStream = new FileOutputStream(this.outputDir + this.outputFileName);  
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fileOutputStream);  
            encoder.encode(bufferedImage);  
            g.dispose();  
            fileOutputStream.close();  
        } catch (Exception e) {  
//          e.printStackTrace();  
            System.out.println("There're some errors when handling picture which path is :" + this.inputDir + this.inputFileName);  
        }  
    }  

    /** 
     * @param inputDir 
     * @param inputFileName 
     * @param outputDir 
     * @param outputFileName 
     * @param isVip 
     * @Date: 2013-8-7   
     * @Author: lulei   
     * @Description:處理圖片 
     */  
    public void dealImage(String inputDir, String inputFileName, String outputDir, String outputFileName, boolean isVip) {  
        this.dealImage(inputDir, inputFileName, outputDir, outputFileName, this.outputWidth, this.outputHeight, this.proportion, isVip);  
    }  

    /** 
     * @param inputDir 
     * @param inputFileName 
     * @param outputDir 
     * @param outputFileName 
     * @param outputWidth 
     * @param outputHeight 
     * @param isVip 
     * @Date: 2013-8-7   
     * @Author: lulei   
     * @Description:處理圖片 
     */  
    public void dealImage(String inputDir, String inputFileName, String outputDir, String outputFileName, int outputWidth, int outputHeight, boolean isVip) {  
        this.dealImage(inputDir, inputFileName, outputDir, outputFileName, outputWidth, outputHeight, this.proportion, isVip);  
    }  

    /** 
     * @param inputDir 
     * @param inputFileName 
     * @param outputDir 
     * @param outputFileName 
     * @param outputWidth 
     * @param outputHeight 
     * @param proportion 
     * @param isVip 
     * @Date: 2013-8-7   
     * @Author: lulei   
     * @Description:處理圖片 
     */  
    public void dealImage(String inputDir, String inputFileName, String outputDir, String outputFileName, int outputWidth, int outputHeight, boolean proportion, boolean isVip) {  
        this.inputDir = inputDir;  
        this.inputFileName = inputFileName;  
        this.outputDir = outputDir;  
        this.outputFileName = outputFileName;  
        this.outputWidth = outputWidth;  
        this.outputHeight = outputHeight;  
        this.proportion = proportion;  
        this.dealImage(isVip);  
    }  

    /** 
     * @param img 
     * @return 
     * @Date: 2013-8-7   
     * @Author: lulei   
     * @Description:返回壓縮后的圖片寬和高 
     */  
    private int[] getNewWidthAndHeight(Image img){  
        int[] reInt = new int[2];  
        if (this.proportion) {  
            double rateW = ((double)img.getWidth(null)) / (double)this.outputWidth + 0.1;  
            double rateH = ((double)img.getHeight(null)) / (double)this.outputHeight + 0.1;  
            double rate = rateW > rateH ? rateW :rateH;  
            reInt[0] = (int)(((double)img.getWidth(null)) / rate);  
            reInt[1] = (int)(((double)img.getHeight(null)) / rate);  
        } else {  
            reInt[0] = this.outputWidth;  
            reInt[1] = this.outputHeight;  
        }  
        return reInt;  
    }  
}  





下面的類是對圖片文件或者圖片文件夾做統一的處理: Java代碼 收藏代碼

 /**   
 *@Description:   批處理文件夾下的所有圖片   
 */   
package cn.lulei.image.deal;    

import java.io.File;  

import cn.lulei.image.deal.DealImage;  


public class DealImageFile {  

    //圖片后綴名  
    private static String[] IMG_TYPE = {".jpg",".bmp",".jpeg",".png",".pcx",".tiff",".gif",".tga",".exif"  
            ,".fpx",".svg",".psd","cdr",".pcd",".dxf",".ufo",".eps",".hdri",".ai",".raw"};   
    private static int outputHeight = 200;  
    private static int outputWidth = 200;  
    private static int count = 0;  
    private static boolean proportion = true;  

    public String dealImageFile(String inputDir, String outputDir) {  
        return this.dealImageFile(inputDir, outputDir, outputWidth, outputHeight, proportion);  
    }  

    public String dealImageFile(String inputDir, String outputDir, int outputWidth, int outputHeight) {  
        return this.dealImageFile(inputDir, outputDir, outputWidth, outputHeight, proportion);  
    }  
    /** 
     * @param inputDir 
     * @param outputDir 
     * @param outputWidth 
     * @param outputHeight 
     * @param proportion 
     * @return 
     * @Date: 2013-8-7   
     * @Author: lulei   
     * @Description:批處理文件夾下的文件 
     */  
    public String dealImageFile(String inputDir, String outputDir, int outputWidth, int outputHeight, boolean proportion) {  
        File fileDir = new File(inputDir);  
        File[] files = fileDir.listFiles();  
        DealImage dealImage = new DealImage();  
        for (File file : files) {  
            String imgPath = file.toString().toLowerCase();  
            String fileName = imgPath.substring(inputDir.length());  
            if (this.isImage(imgPath)) {  
                dealImage.dealImage(inputDir, fileName, outputDir, fileName, outputWidth, outputHeight, proportion, true);  
                count++;   
            } else if (file.isDirectory()) {  
                if (!imgPath.equals(outputDir.toLowerCase())) {  
                    //這里是遞歸  
                    this.dealImageFile(imgPath, outputDir + "/" + fileName, outputWidth, outputHeight, proportion);  
                }  
            }  
        }  
        return "Handle " + count + " pictures! ";  
    }  

    private boolean isImage(String imgPath) {  
        for (String str : IMG_TYPE) {  
            if (imgPath.endsWith(str)) {  
                return true;  
            }  
        }  
        return false;  
    }  

    public static void main(String[] args) {  
        // TODO Auto-generated method stub    

    }  

}  </pre> 


 本文由用戶 d6nd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!