1. 程式人生 > >java 圖片處理類, PNG, JPG 互轉, 支援圓角, 等比摳正方形圖

java 圖片處理類, PNG, JPG 互轉, 支援圓角, 等比摳正方形圖

綜合網上刪除Alpha通道的內容, 修改出來的版本, 勉強算原創吧

注意點: 這裡所有方法都是不支援多執行緒的(因為ImageIO)

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /* 
  2.  * 圖片處理類 
  3.  */
  4. package image;  
  5. import com.sun.image.codec.jpeg.JPEGCodec;  
  6. import com.sun.image.codec.jpeg.JPEGEncodeParam;  
  7. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  8. import java.awt.AlphaComposite;  
  9. import java.awt.Color;  
  10. import java.awt.Graphics2D;  
  11. import java.awt.Image;  
  12. import java.awt.Rectangle;  
  13. import java.awt.RenderingHints;  
  14. import java.awt.Transparency;  
  15. import java.awt.geom.Area;  
  16. import java.awt.geom.RoundRectangle2D;  
  17. import java.awt.image.BufferedImage;  
  18. import java.io.File;  
  19. import
     java.io.FileOutputStream;  
  20. import java.io.IOException;  
  21. import javax.imageio.ImageIO;  
  22. /** 
  23.  * 
  24.  * @author sanshizi 
  25.  */
  26. publicclass ImageUtil {  
  27.     /** 
  28.      * 針對高度與寬度進行等比縮放 
  29.      * 
  30.      * @param img 
  31.      * @param maxSize 要縮放到的尺寸 
  32.      * @param type 1:高度與寬度的最大值為maxSize進行等比縮放 , 2:高度與寬度的最小值為maxSize進行等比縮放 
  33.      * @return
     
  34.      */
  35.     privatestatic Image getScaledImage(BufferedImage img, int maxSize, int type) {  
  36.         int w0 = img.getWidth();  
  37.         int h0 = img.getHeight();  
  38.         int w = w0;  
  39.         int h = h0;  
  40.         if (type == 1) {  
  41.             w = w0 > h0 ? maxSize : (maxSize * w0 / h0);  
  42.             h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;  
  43.         } elseif (type == 2) {  
  44.             w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;  
  45.             h = w0 > h0 ? maxSize : (maxSize * h0 / w0);  
  46.         }  
  47.         Image image = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);  
  48.         BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);  
  49.         Graphics2D g = result.createGraphics();  
  50.         g.drawImage(image, 00null);//在適當的位置畫出
  51.         return result;  
  52.     }  
  53.     /** 
  54.      * 先按最小寬高為size等比例綻放, 然後影象居中摳出直徑為size的圓形影象 
  55.      * 
  56.      * @param img 
  57.      * @param size 
  58.      * @return 
  59.      */
  60.     privatestatic BufferedImage getRoundedImage(BufferedImage img, int size) {  
  61.         return getRoundedImage(img, size, size / 22);  
  62.     }  
  63.     /** 
  64.      * 先按最小寬高為size等比例綻放, 然後影象居中摳出半徑為radius的圓形影象 
  65.      * 
  66.      * @param img 
  67.      * @param size 要縮放到的尺寸 
  68.      * @param radius 圓角半徑 
  69.      * @param type 1:高度與寬度的最大值為maxSize進行等比縮放 , 2:高度與寬度的最小值為maxSize進行等比縮放 
  70.      * @return 
  71.      */
  72.     privatestatic BufferedImage getRoundedImage(BufferedImage img, int size, int radius, int type) {  
  73.         BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);  
  74.         Graphics2D g = result.createGraphics();  
  75.         //先按最小寬高為size等比例綻放, 然後影象居中摳出直徑為size的圓形影象
  76.         Image fixedImg = getScaledImage(img, size, type);  
  77.         g.drawImage(fixedImg, (size - fixedImg.getWidth(null)) / 2, (size - fixedImg.getHeight(null)) / 2null);//在適當的位置畫出
  78.         //圓角
  79.         if (radius > 0) {  
  80.             RoundRectangle2D round = new RoundRectangle2D.Double(00, size, size, radius * 2, radius * 2);  
  81.             Area clear = new Area(new Rectangle(00, size, size));  
  82.             clear.subtract(new Area(round));  
  83.             g.setComposite(AlphaComposite.Clear);  
  84.             //抗鋸齒
  85.             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
  86.             g.fill(clear);  
  87.             g.dispose();  
  88.         }  
  89.         return result;  
  90.     }  
  91.     /** 
  92.      * 使用刪除alpha值的方式去掉影象的alpha通道 
  93.      * 
  94.      * @param $image 
  95.      * @return 
  96.      */
  97.     protectedstatic BufferedImage get24BitImage(BufferedImage $image) {  
  98.         int __w = $image.getWidth();  
  99.         int __h = $image.getHeight();  
  100.         int[] __imgARGB = getRGBs($image.getRGB(00, __w, __h, null0, __w));  
  101.         BufferedImage __newImg = new BufferedImage(__w, __h, BufferedImage.TYPE_INT_RGB);  
  102.         __newImg.setRGB(00, __w, __h, __imgARGB, 0, __w);  
  103.         return __newImg;  
  104.     }  
  105.     /** 
  106.      * 使用繪製的方式去掉影象的alpha值 
  107.      * 
  108.      * @param $image 
  109.      * @param $bgColor 
  110.      * @return 
  111.      */
  112.     protectedstatic BufferedImage get24BitImage(BufferedImage $image, Color $bgColor) {  
  113.         int $w = $image.getWidth();  
  114.         int $h = $image.getHeight();  
  115.         BufferedImage img = new BufferedImage($w, $h, BufferedImage.TYPE_INT_RGB);  
  116.         Graphics2D g = img.createGraphics();  
  117.         g.setColor($bgColor);  
  118.         g.fillRect(00, $w, $h);  
  119.         g.drawRenderedImage($image, null);  
  120.         g.dispose();  
  121.         return img;  
  122.     }  
  123.     /** 
  124.      * 將32位色彩轉換成24位色彩(丟棄Alpha通道) 
  125.      * 
  126.      * @param $argb 
  127.      * @return 
  128.      */
  129.     publicstaticint[] getRGBs(int[] $argb) {  
  130.         int[] __rgbs = newint[$argb.length];  
  131.         for (int i = 0; i < $argb.length; i++) {  
  132.             __rgbs[i] = $argb[i] & 0xFFFFFF;  
  133.         }  
  134.         return __rgbs;  
  135.     }  
  136.     publicstaticvoid toJPG(File img, File save, int size, int quality) throws IOException {  
  137.         FileOutputStream out = new FileOutputStream(save);  
  138.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
  139.         BufferedImage image = (BufferedImage) getRoundedImage(ImageIO.read(img), size, 02);//預設無圓角
  140.         //如果影象是透明的,就丟棄Alpha通道
  141.         if (image.getTransparency() == Transparency.TRANSLUCENT) {  
  142.             image = get24BitImage(image);  
  143.         }  
  144.         JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);//使用jpeg編碼器
  145.         param.setQuality(1true);//高質量jpg圖片輸出
  146.         encoder.encode(image, param);  
  147.         out.close();  
  148.     }  
  149.     publicstaticvoid toPNG(File img, File save, int size) throws IOException {  
  150.         ImageIO.write((BufferedImage) getRoundedImage(ImageIO.read(img), size, 02), "PNG", save);//預設無圓角
  151.     }  
  152.     publicstaticvoid main(String[] args) throws IOException {  
  153.         File img = new File("e:\\Users\\rocky\\Desktop\\0\\IMG_0404.PNG");  
  154.         File save = new File("e:\\Users\\rocky\\Desktop\\0\\zz.jpg");  
  155.         toJPG(img, save, 250100);  
  156.     }  
  157. }  
/*
 * 圖片處理類
 */
package image;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author sanshizi
 */
public class ImageUtil {

    /**
     * 針對高度與寬度進行等比縮放
     *
     * @param img
     * @param maxSize 要縮放到的尺寸
     * @param type 1:高度與寬度的最大值為maxSize進行等比縮放 , 2:高度與寬度的最小值為maxSize進行等比縮放
     * @return
     */
    private static Image getScaledImage(BufferedImage img, int maxSize, int type) {
        int w0 = img.getWidth();
        int h0 = img.getHeight();
        int w = w0;
        int h = h0;
        if (type == 1) {
            w = w0 > h0 ? maxSize : (maxSize * w0 / h0);
            h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;
        } else if (type == 2) {
            w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;
            h = w0 > h0 ? maxSize : (maxSize * h0 / w0);
        }
        Image image = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);
        BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();
        g.drawImage(image, 0, 0, null);//在適當的位置畫出
        return result;
    }

    /**
     * 先按最小寬高為size等比例綻放, 然後影象居中摳出直徑為size的圓形影象
     *
     * @param img
     * @param size
     * @return
     */
    private static BufferedImage getRoundedImage(BufferedImage img, int size) {
        return getRoundedImage(img, size, size / 2, 2);
    }

    /**
     * 先按最小寬高為size等比例綻放, 然後影象居中摳出半徑為radius的圓形影象
     *
     * @param img
     * @param size 要縮放到的尺寸
     * @param radius 圓角半徑
     * @param type 1:高度與寬度的最大值為maxSize進行等比縮放 , 2:高度與寬度的最小值為maxSize進行等比縮放
     * @return
     */
    private static BufferedImage getRoundedImage(BufferedImage img, int size, int radius, int type) {

        BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();

        //先按最小寬高為size等比例綻放, 然後影象居中摳出直徑為size的圓形影象
        Image fixedImg = getScaledImage(img, size, type);
        g.drawImage(fixedImg, (size - fixedImg.getWidth(null)) / 2, (size - fixedImg.getHeight(null)) / 2, null);//在適當的位置畫出

        //圓角
        if (radius > 0) {
            RoundRectangle2D round = new RoundRectangle2D.Double(0, 0, size, size, radius * 2, radius * 2);
            Area clear = new Area(new Rectangle(0, 0, size, size));
            clear.subtract(new Area(round));
            g.setComposite(AlphaComposite.Clear);

            //抗鋸齒
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.fill(clear);
            g.dispose();
        }
        return result;
    }

    /**
     * 使用刪除alpha值的方式去掉影象的alpha通道
     *
     * @param $image
     * @return
     */
    protected static BufferedImage get24BitImage(BufferedImage $image) {
        int __w = $image.getWidth();
        int __h = $image.getHeight();
        int[] __imgARGB = getRGBs($image.getRGB(0, 0, __w, __h, null, 0, __w));
        BufferedImage __newImg = new BufferedImage(__w, __h, BufferedImage.TYPE_INT_RGB);
        __newImg.setRGB(0, 0, __w, __h, __imgARGB, 0, __w);
        return __newImg;
    }

    /**
     * 使用繪製的方式去掉影象的alpha值
     *
     * @param $image
     * @param $bgColor
     * @return
     */
    protected static BufferedImage get24BitImage(BufferedImage $image, Color $bgColor) {
        int $w = $image.getWidth();
        int $h = $image.getHeight();
        BufferedImage img = new BufferedImage($w, $h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        g.setColor($bgColor);
        g.fillRect(0, 0, $w, $h);
        g.drawRenderedImage($image, null);
        g.dispose();
        return img;
    }

    /**
     * 將32位色彩轉換成24位色彩(丟棄Alpha通道)
     *
     * @param $argb
     * @return
     */
    public static int[] getRGBs(int[] $argb) {
        int[] __rgbs = new int[$argb.length];
        for (int i = 0; i < $argb.length; i++) {
            __rgbs[i] = $argb[i] & 0xFFFFFF;
        }
        return __rgbs;
    }

    public static void toJPG(File img, File save, int size, int quality) throws IOException {
        FileOutputStream out = new FileOutputStream(save);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

        BufferedImage image = (BufferedImage) getRoundedImage(ImageIO.read(img), size, 0, 2);//預設無圓角

        //如果影象是透明的,就丟棄Alpha通道
        if (image.getTransparency() == Transparency.TRANSLUCENT) {
            image = get24BitImage(image);
        }

        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);//使用jpeg編碼器
        param.setQuality(1, true);//高質量jpg圖片輸出
        encoder.encode(image, param);

        out.close();
    }

    public static void toPNG(File img, File save, int size) throws IOException {
        ImageIO.write((BufferedImage) getRoundedImage(ImageIO.read(img), size, 0, 2), "PNG", save);//預設無圓角
    }

    public static void main(String[] args) throws IOException {
        File img = new File("e:\\Users\\rocky\\Desktop\\0\\IMG_0404.PNG");
        File save = new File("e:\\Users\\rocky\\Desktop\\0\\zz.jpg");

        toJPG(img, save, 250, 100);
    }
}