java 图片处理类, PNG, JPG 互转, 支持圆角, 等比抠正方形图

9 篇文章 0 订阅
5 篇文章 0 订阅

综合网上删除Alpha通道的内容, 修改出来的版本, 勉强算原创吧

注意点: 这里所有方法都是不支持多线程的(因为ImageIO)


  1. /* 
  2.  * 图片处理类 
  3.  */  
  4. package image;  
  5.   
  6. import com.sun.image.codec.jpeg.JPEGCodec;  
  7. import com.sun.image.codec.jpeg.JPEGEncodeParam;  
  8. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  9. import java.awt.AlphaComposite;  
  10. import java.awt.Color;  
  11. import java.awt.Graphics2D;  
  12. import java.awt.Image;  
  13. import java.awt.Rectangle;  
  14. import java.awt.RenderingHints;  
  15. import java.awt.Transparency;  
  16. import java.awt.geom.Area;  
  17. import java.awt.geom.RoundRectangle2D;  
  18. import java.awt.image.BufferedImage;  
  19. import java.io.File;  
  20. import java.io.FileOutputStream;  
  21. import java.io.IOException;  
  22. import javax.imageio.ImageIO;  
  23.   
  24. /** 
  25.  * 
  26.  * @author sanshizi 
  27.  */  
  28. public class ImageUtil {  
  29.   
  30.     /** 
  31.      * 针对高度与宽度进行等比缩放 
  32.      * 
  33.      * @param img 
  34.      * @param maxSize 要缩放到的尺寸 
  35.      * @param type 1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放 
  36.      * @return 
  37.      */  
  38.     private static Image getScaledImage(BufferedImage img, int maxSize, int type) {  
  39.         int w0 = img.getWidth();  
  40.         int h0 = img.getHeight();  
  41.         int w = w0;  
  42.         int h = h0;  
  43.         if (type == 1) {  
  44.             w = w0 > h0 ? maxSize : (maxSize * w0 / h0);  
  45.             h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;  
  46.         } else if (type == 2) {  
  47.             w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;  
  48.             h = w0 > h0 ? maxSize : (maxSize * h0 / w0);  
  49.         }  
  50.         Image image = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);  
  51.         BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);  
  52.         Graphics2D g = result.createGraphics();  
  53.         g.drawImage(image, 00null);//在适当的位置画出  
  54.         return result;  
  55.     }  
  56.   
  57.     /** 
  58.      * 先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像 
  59.      * 
  60.      * @param img 
  61.      * @param size 
  62.      * @return 
  63.      */  
  64.     private static BufferedImage getRoundedImage(BufferedImage img, int size) {  
  65.         return getRoundedImage(img, size, size / 22);  
  66.     }  
  67.   
  68.     /** 
  69.      * 先按最小宽高为size等比例绽放, 然后图像居中抠出半径为radius的圆形图像 
  70.      * 
  71.      * @param img 
  72.      * @param size 要缩放到的尺寸 
  73.      * @param radius 圆角半径 
  74.      * @param type 1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放 
  75.      * @return 
  76.      */  
  77.     private static BufferedImage getRoundedImage(BufferedImage img, int size, int radius, int type) {  
  78.   
  79.         BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);  
  80.         Graphics2D g = result.createGraphics();  
  81.   
  82.         //先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像  
  83.         Image fixedImg = getScaledImage(img, size, type);  
  84.         g.drawImage(fixedImg, (size - fixedImg.getWidth(null)) / 2, (size - fixedImg.getHeight(null)) / 2null);//在适当的位置画出  
  85.   
  86.         //圆角  
  87.         if (radius > 0) {  
  88.             RoundRectangle2D round = new RoundRectangle2D.Double(00, size, size, radius * 2, radius * 2);  
  89.             Area clear = new Area(new Rectangle(00, size, size));  
  90.             clear.subtract(new Area(round));  
  91.             g.setComposite(AlphaComposite.Clear);  
  92.   
  93.             //抗锯齿  
  94.             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
  95.             g.fill(clear);  
  96.             g.dispose();  
  97.         }  
  98.         return result;  
  99.     }  
  100.   
  101.     /** 
  102.      * 使用删除alpha值的方式去掉图像的alpha通道 
  103.      * 
  104.      * @param $image 
  105.      * @return 
  106.      */  
  107.     protected static BufferedImage get24BitImage(BufferedImage $image) {  
  108.         int __w = $image.getWidth();  
  109.         int __h = $image.getHeight();  
  110.         int[] __imgARGB = getRGBs($image.getRGB(00, __w, __h, null0, __w));  
  111.         BufferedImage __newImg = new BufferedImage(__w, __h, BufferedImage.TYPE_INT_RGB);  
  112.         __newImg.setRGB(00, __w, __h, __imgARGB, 0, __w);  
  113.         return __newImg;  
  114.     }  
  115.   
  116.     /** 
  117.      * 使用绘制的方式去掉图像的alpha值 
  118.      * 
  119.      * @param $image 
  120.      * @param $bgColor 
  121.      * @return 
  122.      */  
  123.     protected static BufferedImage get24BitImage(BufferedImage $image, Color $bgColor) {  
  124.         int $w = $image.getWidth();  
  125.         int $h = $image.getHeight();  
  126.         BufferedImage img = new BufferedImage($w, $h, BufferedImage.TYPE_INT_RGB);  
  127.         Graphics2D g = img.createGraphics();  
  128.         g.setColor($bgColor);  
  129.         g.fillRect(00, $w, $h);  
  130.         g.drawRenderedImage($image, null);  
  131.         g.dispose();  
  132.         return img;  
  133.     }  
  134.   
  135.     /** 
  136.      * 将32位色彩转换成24位色彩(丢弃Alpha通道) 
  137.      * 
  138.      * @param $argb 
  139.      * @return 
  140.      */  
  141.     public static int[] getRGBs(int[] $argb) {  
  142.         int[] __rgbs = new int[$argb.length];  
  143.         for (int i = 0; i < $argb.length; i++) {  
  144.             __rgbs[i] = $argb[i] & 0xFFFFFF;  
  145.         }  
  146.         return __rgbs;  
  147.     }  
  148.   
  149.     public static void toJPG(File img, File save, int size, int quality) throws IOException {  
  150.         FileOutputStream out = new FileOutputStream(save);  
  151.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
  152.   
  153.         BufferedImage image = (BufferedImage) getRoundedImage(ImageIO.read(img), size, 02);//默认无圆角  
  154.   
  155.         //如果图像是透明的,就丢弃Alpha通道  
  156.         if (image.getTransparency() == Transparency.TRANSLUCENT) {  
  157.             image = get24BitImage(image);  
  158.         }  
  159.   
  160.         JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);//使用jpeg编码器  
  161.         param.setQuality(1true);//高质量jpg图片输出  
  162.         encoder.encode(image, param);  
  163.   
  164.         out.close();  
  165.     }  
  166.   
  167.     public static void toPNG(File img, File save, int size) throws IOException {  
  168.         ImageIO.write((BufferedImage) getRoundedImage(ImageIO.read(img), size, 02), "PNG", save);//默认无圆角  
  169.     }  
  170.   
  171.     public static void main(String[] args) throws IOException {  
  172.         File img = new File("e:\\Users\\rocky\\Desktop\\0\\IMG_0404.PNG");  
  173.         File save = new File("e:\\Users\\rocky\\Desktop\\0\\zz.jpg");  
  174.   
  175.         toJPG(img, save, 250100);  
  176.     }  
  177. }  
/*
 * 图片处理类
 */
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);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值