java 圖片轉換工具


package com.sicdt.sicsign.web.utils;


import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import org.apache.commons.io.FileUtils;
import org.bouncycastle.util.encoders.Base64Encoder;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;

public class MyImgUtils {
    
    /**
     * <br>描 述: 將圖片BASE64字符串轉為二進制數組
     * <br>作 者: 七脈
     * @param base64 new Image();img.src或canvas.toDataURL("image/png")
     * @return
     * @throws IOException
     */
    @SuppressWarnings("restriction")
    public static byte[] imgBase64ToBytes(String base64) {
        sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
        //因為參數base64來源不一樣,需要將附件數據替換清空掉。如果此入參來自canvas.toDataURL("image/png");
        base64 = base64.replaceAll("data:image/png;base64,", "");
        //base64解碼並轉為二進制數組
        byte[] bytes = null;
        try {
            bytes = decoder.decodeBuffer(base64);
            for (int i = 0; i < bytes.length; ++i) {  
                if (bytes[i] < 0) {// 調整異常數據  
                    bytes[i] += 256;  
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bytes;
    }
    
    /**
     * <br>描 述: 圖片字節數組轉base64
     * <br>作 者: shizhenwei 
     * <br>歷 史: (版本) 作者 時間 注釋
     * @return
     */
    @SuppressWarnings("restriction")
    public static String bytesToImgBase64(byte[] bytes){
        sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        return encoder.encode(bytes);
    }
    
    /**
     * 
     * <br>描 述:    圖片/文件轉二進制數組,這個方法有很多,只寫一個
     * <br>作 者: 七脈
     * @param imgPath 圖片路徑
     * @return
     * @throws FileNotFoundException
     */
    public static byte[] imgToBytes(String imgPath) {
        File file = new File(imgPath);
        BufferedImage bi = null;
        ByteArrayOutputStream baos = null;
        try {
            //文件使用其他工具
            bi = ImageIO.read(file);
            baos = new ByteArrayOutputStream();
            int index = imgPath.lastIndexOf(".");
            String format = imgPath.substring(index+1);
            ImageIO.write(bi, format, baos);
            byte[] bytes = baos.toByteArray();
            baos.close();
            return bytes;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 
     * <br>描 述:    將二進制轉換為圖片
     * <br>作 者: 七脈
     * @param outPath 將圖片輸出到哪里
     * @param savePath 保存位置
     */
    public static void bytesToImg(byte[] bytes,String savePath){
        ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
        try {
            BufferedImage bi = ImageIO.read(baos);
            File file = new File(savePath);
            ImageIO.write(bi, "png", file);
            baos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * <br>描 述:    圖片二進制數組轉PDF二進制數組
     * <br>作 者: 七脈
     * @param imgBytes 圖片二進制數組
     * @return
     */
    public static byte[] imgBytesToPdfBytes(byte[] imgBytes){
            byte[] bytes = null;
            Document document = new Document();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try {
                PdfWriter.getInstance(document, baos);
                // 設置文檔的大小
                document.setPageSize(PageSize.A4);
                // 打開文檔
                document.open();
                // 讀取一個圖片
                Image image = Image.getInstance(imgBytes);
                float imageWidth = image.getScaledWidth();
                int i = 0;
                while (imageWidth > 600) {
                    image.scalePercent(100 - i);
                    i++;
                    imageWidth = image.getScaledWidth();
                }
                image.setAlignment(Image.ALIGN_CENTER);
                // 插入一個圖片
                document.add(image);
                //轉二進制數組
                bytes = baos.toByteArray();
                return bytes;
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(null!=baos){
                    try {
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(null!=document){
                    document.close();
                }
            }
            return bytes;
    }
    
    
    /**
     * 
     * <br>描 述:    二進制轉文件,什么樣的二進制轉什么樣的文件
     * <br>作 者: 七脈 
     * @param bytes 二進制數組
     * @param savePath 文件保存路徑
     */
    public static void byteArrayToFile(byte[] bytes,String savePath){
        try {
            FileUtils.writeByteArrayToFile(new File(savePath), bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * <br>描 述: 去除圖片背景,轉透明圖
     * <br>作 者: shizhenwei 
     * <br>歷 史: (版本) 作者 時間 注釋
     * @param is
     * @return
     */
    public static byte[] toTransparency(InputStream is) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            BufferedImage bi = ImageIO.read(is);
            java.awt.Image image = (java.awt.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());
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);// 直接輸出文件
        } catch (Exception e) {
            e.printStackTrace();
        }
        return byteArrayOutputStream.toByteArray();
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM