1. 程式人生 > 遊戲攻略 >《寶可夢傳說阿爾宙斯》黑曜原野部分精靈捕捉方法及位置說明

《寶可夢傳說阿爾宙斯》黑曜原野部分精靈捕捉方法及位置說明

1.pom.xml檔案配置

org.apache.pdfbox fontbox 2.0.1 org.apache.pdfbox pdfbox 2.0.1

2.工具類

import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

/**

  • TODO

  • @Author: DYS

  • @date 2021/8/4 18:02

  • @描述:
    */
    @Slf4j
    public class Base64Utils {

    /**

    • @描述: 根據base64編碼生成圖片,儲存在Path中
    • @Date: 2021/8/5 13:08
    • @param base64Code:
    • @param filePath:
    • @param picName:
    • @return boolean
    • @Description: //TODO PC002
    • @Author: DYS
      **/
      public static boolean base64ToPic(String base64Code, String filePath, String picName) {
      if (base64Code == null) {
      return false;
      }
      //檔案不存在
      File existsFilePath = new File(filePath);
      if (!existsFilePath.exists()) {
      existsFilePath.mkdirs();
      }
      // String handledBase64Code = "data:image/png;base64," + base64PdfToJpgBase64(base64Code);
      String handledBase64Code =base64PdfToJpgBase64(base64Code);
      // Base64解碼
      // 替換掉多餘的空格
      String replace = handledBase64Code.replaceAll(" ", "");
      BASE64Decoder decoder = new BASE64Decoder();
      try {
      //Base64解碼
      byte[] b = decoder.decodeBuffer(replace);
      for (int i = 0; i < b.length; ++i) {
      if (b[i] < 0) {//調整異常資料
      b[i] += 256;
      }
      }
      //生成jpeg圖片
      String path = filePath + "/" + picName + ".png";
      OutputStream out = new FileOutputStream(path);
      out.write(b);
      out.flush();
      out.close();
      return true;
      } catch (Exception e) {
      StringWriter stringWriter = new StringWriter();
      PrintWriter printWriter = new PrintWriter(stringWriter);
      e.printStackTrace();
      e.printStackTrace(printWriter);
      log.error("base64編碼生成圖片 error >>> " + stringWriter.toString());
      return false;
      }
      }

    // 將pdf的base64編碼格式轉為img的base64編碼格式併合成一張圖片:
    public static String base64PdfToJpgBase64(String base64Pdf) {
    if (StrUtil.isEmpty(base64Pdf)) {
    return null;
    }
    String jpg_base64 = null;
    // Base64Decoder decoder = new Base64Decoder();
    try {
    // Base64解碼
    byte[] pdf_bytes = Base64Decoder.decode(base64Pdf);
    PDDocument doc = PDDocument.load(pdf_bytes);
    int size = doc.getNumberOfPages();
    /影象合併使用的引數/
    //定義寬度
    int width = 0;
    // 儲存一張圖片中的RGB資料
    int[] singleImgRGB;
    // 定義高度,後面用於疊加
    int shiftHeight = 0;
    //儲存每張圖片的畫素值
    BufferedImage imageResult = null;
    // 利用PdfBox生成影象
    PDDocument pdDocument = doc;
    PDFRenderer renderer = new PDFRenderer(pdDocument);
    /根據總頁數, 按照50頁生成一張長圖片的邏輯, 進行拆分/
    // 每50頁轉成1張圖片
    int pageLength = size; //有多少轉多少
    // 總計迴圈的次數
    int totalCount = pdDocument.getNumberOfPages() / pageLength + 1;
    for (int m = 0; m < totalCount; m++) {
    for (int i = 0; i < pageLength; i++) {
    int pageIndex = i + (m * pageLength);
    if (pageIndex == pdDocument.getNumberOfPages()) {
    System.out.println("迴圈次數 m = " + m);
    break;
    }
    // 96為圖片的dpi,dpi越大,則圖片越清晰,圖片越大,轉換耗費的時間也越多
    BufferedImage image = renderer.renderImageWithDPI(pageIndex, 150, ImageType.RGB);
    int imageHeight = image.getHeight();
    int imageWidth = image.getWidth();
    if (i == 0) {
    //計算高度和偏移量
    //使用第一張圖片寬度;
    width = imageWidth;
    // 儲存每頁圖片的畫素值
    // 加個判斷:如果m次迴圈後所剩的圖片總數小於pageLength,則圖片高度按剩餘的張數繪製,否則會出現長圖片下面全是黑色的情況
    if ((pdDocument.getNumberOfPages() - m * pageLength) < pageLength) {
    imageResult = new BufferedImage(width, imageHeight * (pdDocument.getNumberOfPages() - m * pageLength), BufferedImage.TYPE_INT_RGB);
    } else {
    imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
    }
    } else {
    // 將高度不斷累加
    shiftHeight += imageHeight;
    }
    singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
    imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
    }
    // 這個很重要,下面會有說明
    shiftHeight = 0;
    }
    pdDocument.close();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
    ImageIO.write(imageResult, "jpg", baos);//寫入流中
    byte[] jpg_Bytes = baos.toByteArray();//轉換成位元組
    BASE64Encoder encoder = new BASE64Encoder();
    jpg_base64 = encoder.encodeBuffer(jpg_Bytes).trim();//轉換成base64串
    jpg_base64 = jpg_base64.replaceAll("\n", "").replaceAll("\r", "");//刪除 \r\n
    baos.close();
    doc.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return jpg_base64;
    }

    /**

    • 圖片生成base64編碼
    • @param imgPath
    • @return
      */
      public static String PicToBase64(String imgPath) {
      String result = "";
      File imgFile = new File(imgPath);
      if (!imgFile.exists()) {
      System.out.println("非法路徑");
      return result;
      }
      InputStream in = null;
      byte[] data = null;
      //讀取圖片位元組陣列
      try {
      in = new FileInputStream(imgFile);
      data = new byte[in.available()];
      in.read(data);
      in.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      //對位元組陣列Base64編碼
      BASE64Encoder encoder = new BASE64Encoder();
      return encoder.encode(data);//返回Base64編碼過的位元組陣列字串
      }

    public static byte[] base64ToImgByteArray(String base64) throws IOException {
    sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
    //因為引數base64來源不一樣,需要將附件資料替換清空掉。如果此入參來自canvas.toDataURL("image/png");
    base64 = base64.replaceAll("data:image/png;base64,", "");
    //base64解碼並轉為二進位制陣列
    byte[] bytes = decoder.decodeBuffer(base64);
    for (int i = 0; i < bytes.length; ++i) {
    if (bytes[i] < 0) {// 調整異常資料
    bytes[i] += 256;
    }
    }
    return bytes;
    }

}