《寶可夢傳說阿爾宙斯》黑曜原野部分精靈捕捉方法及位置說明
1.pom.xml檔案配置
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;
}
}