zoukankan      html  css  js  c++  java
  • java将白色背景图片转换成透明图片

    package evecom.image;
    
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    
    public class Alpha {
    
        public static void main(String[] args) {
            System.out.println(transferAlpha2File("d:/tmp/test.png", "d:/tmp/test_1.png"));
        }
    
        public static boolean transferAlpha2File(String imgSrc, String imgTarget) {
            File file = new File(imgSrc);
            InputStream is = null;
            boolean result = false;
            try {
                is = new FileInputStream(file);
                // 如果是MultipartFile类型,那么自身也有转换成流的方法:is = file.getInputStream();
                BufferedImage bi = ImageIO.read(is);
                Image image = (Image) bi;
                ImageIcon imageIcon = new ImageIcon(image);
                BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(),
                        BufferedImage.TYPE_4BYTE_ABGR);
                Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
                g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
                int alpha = 0;
                for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
                    for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
                        int rgb = bufferedImage.getRGB(j2, j1);
                        int R = (rgb & 0xff0000) >> 16;
                        int G = (rgb & 0xff00) >> 8;
                        int B = (rgb & 0xff);
                        if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {
                            rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
                        }
                        bufferedImage.setRGB(j2, j1, rgb);
                    }
                }
                g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
                result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件
            } catch (Exception e) {
                e.printStackTrace();
                result = false;
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                    }
                }
            }
            return result;
        }
        
        public static byte[] transferAlpha2Byte(String imgSrc) {
            ByteArrayOutputStream byteArrayOutputStream = null;
            File file = new File(imgSrc);
            InputStream is = null;
            byte[] result = null;
            try {
                is = new FileInputStream(file);
                // 如果是MultipartFile类型,那么自身也有转换成流的方法:is = file.getInputStream();
                BufferedImage bi = ImageIO.read(is);
                Image image = (Image) bi;
                ImageIcon imageIcon = new ImageIcon(image);
                BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(),
                        BufferedImage.TYPE_4BYTE_ABGR);
                Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
                g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
                int alpha = 0;
                for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
                    for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
                        int rgb = bufferedImage.getRGB(j2, j1);
    
                        int R = (rgb & 0xff0000) >> 16;
                        int G = (rgb & 0xff00) >> 8;
                        int B = (rgb & 0xff);
                        if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {
                            rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
                        }
    
                        bufferedImage.setRGB(j2, j1, rgb);
    
                    }
                }
    
                g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
                byteArrayOutputStream = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, "png", byteArrayOutputStream);//转换成byte数组
                result = byteArrayOutputStream.toByteArray();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                    }
                }
                if (byteArrayOutputStream != null) {
                    try {
                        byteArrayOutputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                    }
                }
            }
            return result;
        }
    }
  • 相关阅读:
    What version of .NET Framework is integrated into what version of OS?
    《千字文》古今第一文,1000字无重复,囊括各个方面的知识!
    这些习惯正在阻碍你的成长(你正在做。。。)
    百家讲坛另附笔记
    百家讲坛之曾国藩笔记
    《挪威的森林》经典语录
    《悲伤逆流成河》台词摘抄
    2018年11月29日,晴
    关于描述的一些感悟
    2018年11月27日, 晴
  • 原文地址:https://www.cnblogs.com/101key/p/9524675.html
Copyright © 2011-2022 走看看