以前在百度AI社區寫的人像分割帖子,最近有一些開發者會遇到返回的透明圖的base64存圖片有問題,還想知道存起來的透明圖片如何更改背景色,想快速作個證件照的應用。java
此文呢。就從接口返回的透明圖片搞起。把返回的git
foreground - 人像前景摳圖,透明背景json
保存成png格式的圖片。並進行背景色修改。證件照尺寸修改就不演示了。畢竟仍是要給你們一些自我發揮的機會的呢。數組
註冊百度帳號、建立應用就不陳述了。 ssh
import com.baidu.aip.bodyanalysis.AipBodyAnalysis; import org.json.JSONObject; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Base64; /** * 調用百度AI 人像分割接口示例 * @author 小帥丶 * @Date 2019/10/11-15:56 **/ public class TestPersonSeg { public static void main(String[] args) { String APPID = ""; String APIKEY = ""; String SECRETKEY = ""; AipBodyAnalysis client = new AipBodyAnalysis(APPID, APIKEY, SECRETKEY); String filePath = "F:\\testimg\\20151218164804_8kY2a.jpeg"; //調用接口 JSONObject object = client.bodySeg(filePath, null); String foreground = object.get("foreground").toString(); //把foreground 保存成png格式的透明圖片 GenerateImage(foreground, "F:\\testimg\\101103.png"); } /** * base64字符串轉化成圖片 * @param imgStr 接口返回的圖片base64數據 * @param imgFilePath 即將要保存的圖片的本地路徑包含文件名稱和格式 例如:F:/generateimage.jpg * @return */ public static boolean GenerateImage(String imgStr, String imgFilePath) { // 對字節數組字符串進行Base64解碼並生成圖片 if (imgStr == null) // 圖像數據爲空 return false; Base64.Decoder decoder = Base64.getDecoder(); try { // Base64解碼 byte[] b = decoder.decode(imgStr); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) { // 調整異常數據 b[i] += 256; } } // 生成jpeg圖片 OutputStream out = new FileOutputStream(imgFilePath); // 新生成的圖片 out.write(b); out.flush(); out.close(); System.out.println("保存成功" + imgFilePath); return true; } catch(Exception e) { System.out.println("出錯了" + e.getMessage()); return false; } } }
須要用到
BufferedImage.TYPE_INT_RGB
源碼註釋解釋以下
Represents an image with 8-bit RGB color components packed intointeger pixels 就是8位RGB的圖像進行處理xss
https://gitee.com/xshuai/imagetool/blob/master/src/main/java/cn/xsshome/imagetool/util/PngColoringUtil.java
這裏是代碼地址。imagetool項目裏面還有不少其餘的圖片處理工具類哦 最好使用JDK1.8+
若是不是請替換bytes轉base64方法工具
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Base64; /** * @Description 透明背景上色 * @author 小帥丶 * @className PngColoringUtil * @Date 2019/10/11-17:03 **/ public class PngColoringUtil { /** * @Description 給PNG圖片增長背景色 * @Author 小帥丶 * @param sourceImage 原始圖片 最好是PNG透明的 * @param targetImage 修改後的圖片 * @param backgroudColor 背景色 **/ public static void changePNGBackgroudColor(String sourceImage, String targetImage, Color backgroudColor) { try { BufferedImage result = changePNGBackgroudColor(sourceImage, backgroudColor); File output = new File(targetImage); ImageIO.write(result, "jpg", output); } catch (IOException e) { System.out.println("有問題了" + e.getMessage()); } } /** * @Description 給PNG圖片增長背景色 返回base64 * @Author 小帥丶 * @param sourceImage 原始圖片 最好是PNG透明的 * @param backgroudColor 背景色 * @return java.lang.String **/ public static String changePNGBackgroudColorByBase64(String sourceImage, Color backgroudColor){ try { String base64 = ""; BufferedImage result = changePNGBackgroudColor(sourceImage, backgroudColor); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(result, "jpg", baos ); baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close(); final Base64.Encoder encoder = Base64.getEncoder(); base64 = encoder.encodeToString(imageInByte); return base64; }catch (Exception e){ System.out.println("有問題了" + e.getMessage()); return null; } } /** * @Description 給PNG圖片增長背景色 返回BufferedImage * @Author 小帥丶 * @param sourceImage 原始圖片 最好是PNG透明的 * @param backgroudColor 背景色 * @return BufferedImage **/ public static BufferedImage changePNGBackgroudColor(String sourceImage, Color backgroudColor) { try { File input = new File(sourceImage); BufferedImage image = ImageIO.read(input); BufferedImage result = new BufferedImage( image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphic = result.createGraphics(); graphic.drawImage(image, 0, 0, backgroudColor, null); graphic.dispose(); return result; } catch (IOException e) { System.out.println("有問題了" + e.getMessage()); return null; } } }
public static void main(String[] args) throws Exception{ String image = "F:\\testimg\\1011.png";//原始圖片路徑 String resultImage = "F:\\testimg\\10111700.jpg";//更改背景色後的圖片路徑 changePNGBackgroudColor(image,resultImage, Color.pink);//原圖 目標圖 背景色 }