Java使用html2image將html生成縮略圖圖片的實(shí)現(xiàn)示例
POM文件添加Maven依賴
<dependency> <groupId>gui.ava</groupId> <artifactId>html2image</artifactId> <version>0.9</version> </dependency>
主要代碼:
String coverPath = null;
try {
HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
imageGenerator.loadHtml(lzDocs.getContent());//也可以根據(jù)html url引用 loadUrl的方式加載
Thread.sleep(1000); //有時(shí)會(huì)有加載圖片延遲,因此這里設(shè)置下延時(shí)
BufferedImage cover = imageGenerator.getBufferedImage();//獲取圖片
cover = ImageUtils.getCoverImage(cover);//將圖片轉(zhuǎn)成綜略圖
String coverName = UUIDGenerator.generate().toString() + ".png";
MultipartFile mpFile = FileUtils.imageToMpFile(cover, coverName);
coverPath = sysBaseAPI.upload(mpFile,"cover", uploadType);//上傳文件到服務(wù)器
} catch (Exception e) {
e.printStackTrace();
}
圖片工具類,供主要代碼調(diào)用
public class ImageUtils {
/**
* bufferedImage轉(zhuǎn)InputStream
*/
public static InputStream bufferedImageToInputStream(BufferedImage image) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ImageIO.write(image, "png", os);
InputStream input = new ByteArrayInputStream(os.toByteArray());
return input;
} catch (IOException e) {
}
return null;
}
/**
* 獲取圖片大小信息
*/
public static Rectangle getImgRect(BufferedImage image) throws IOException {
Iterator readers = ImageIO.getImageReadersByFormatName("png");
ImageReader reader = (ImageReader) readers.next();
InputStream source = bufferedImageToInputStream(image);
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
int imageIndex = 0;
return new Rectangle(0, 0, reader.getWidth(imageIndex), reader.getHeight(imageIndex));
}
/**
* 圖片裁剪,按指定大小裁剪
*/
public static BufferedImage imageCut(BufferedImage image, Rectangle rect) throws IOException {
// 取得圖片讀入器
Iterator readers = ImageIO.getImageReadersByFormatName("png");
System.out.println(readers);
ImageReader reader = (ImageReader) readers.next();
System.out.println(reader);
// 取得圖片讀入流
InputStream source = bufferedImageToInputStream(image);
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
// 圖片參數(shù)
ImageReadParam param = reader.getDefaultReadParam();
int imageIndex = 0;
//Rectangle rect = new Rectangle(0, 0, reader.getWidth(imageIndex), 100);
param.setSourceRegion(rect);
BufferedImage bi = reader.read(0, param);
iis.close();
source.close();
return bi;
}
/**
* 壓縮圖片,用于高質(zhì)量圖片質(zhì)量降低,改變圖片大小
*/
public static BufferedImage compressImage(BufferedImage imageByte, int ppi) {
BufferedImage smallImage = null;
int width = 0, height = 0;
if (imageByte == null)
return null;
InputStream byteInput = bufferedImageToInputStream(imageByte);
try {
Image image = ImageIO.read(byteInput);
int w = image.getWidth(null);
int h = image.getHeight(null);
// adjust weight and height to avoid image distortion
double scale = 0;
scale = Math.min((float) ppi / w, (float) ppi / h);
width = (int) (w * scale);
width -= width % 4;
height = (int) (h * scale);
if (scale >= (double) 1)
return imageByte;
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
//ByteArrayOutputStream out = new ByteArrayOutputStream();
//ImageIO.write(buffImg, "png", out);
smallImage = buffImg;
} catch (IOException e) {
e.printStackTrace();
}
return smallImage;
}
/**
* 將BufferedImage轉(zhuǎn)換為byte[]
* @param image
* @return
*/
public static byte[] bufferedImageToByteArray(BufferedImage image) throws IOException{
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
return os.toByteArray();
}
/**
* 將BufferedImage轉(zhuǎn)換pdf
*/
public static String imageToPdf(List<BufferedImage> images) throws IOException {
log.info("圖片轉(zhuǎn)pdf開始===============");
String newFile = StrUtil.uuid().replace("-", "") + ".pdf";
PdfWriter pdfWriter = new PdfWriter( newFile);
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
Document document = new Document(pdfDocument);
for (BufferedImage image : images) {
byte[] data = bufferedImageToByteArray(image);
com.itextpdf.layout.element.Image img = new com.itextpdf.layout.element.Image(ImageDataFactory.createPng(data));
document.add(img);
}
document.close();
log.info("圖片轉(zhuǎn)pdf結(jié)束===============");
return newFile;
}
/**
* 獲取縮略圖圖片,用作封面,按長(zhǎng)寬比例設(shè)備,高度太高裁掉,高度太低補(bǔ)余白
*/
public static BufferedImage getCoverImage (BufferedImage originalImage) throws IOException {
BufferedImage result = null;
// 獲取圖片的長(zhǎng)寬
int originalWidth = originalImage.getWidth();
int originalHeight = originalImage.getHeight();
Rectangle rect = ImageUtils.getImgRect(originalImage);
if (rect.getHeight() > rect.getWidth()) {
rect.setRect(0,0, rect.getWidth(), rect.getWidth() / 1.3);
result = ImageUtils.imageCut(originalImage, rect);
} else {
int newWidth = 800;
int newHeight = 600;
// 計(jì)算縮放比例
double scale = Math.min((double) newWidth / originalWidth, (double) newHeight / originalHeight);
// 計(jì)算調(diào)整后的長(zhǎng)寬
int scaledWidth = (int) (originalWidth * scale);
int scaledHeight = (int) (originalHeight * scale);
// 創(chuàng)建新的BufferedImage對(duì)象,添加余白
BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = resizedImage.createGraphics();
Color fillColor = new Color(255, 255, 255); // 白顏色
g.setColor(fillColor);
g.fillRect(0, 0, newWidth, newHeight);
g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
result = resizedImage;
}
return result;
}
}到此這篇關(guān)于Java使用html2image將html生成縮略圖圖片的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java 生成縮略圖圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java線程池如何實(shí)現(xiàn)精準(zhǔn)控制每秒API請(qǐng)求
這篇文章主要介紹了Java線程池如何實(shí)現(xiàn)精準(zhǔn)控制每秒API請(qǐng)求問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java使用ip2region獲取用戶的ip歸屬地的詳細(xì)步驟
ip2region?是一個(gè)離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,能實(shí)現(xiàn)10微秒級(jí)別的查詢效率,提供了眾多主流編程語言的xdb數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn),本文給大家介紹了如何使用ip2region獲取用戶的ip歸屬地的詳細(xì)步驟,需要的朋友可以參考下2025-05-05
java 多態(tài)性詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 多態(tài)性詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
使用java實(shí)現(xiàn)BBS論壇發(fā)送郵件過程詳解
這篇文章主要介紹了使用java發(fā)送郵件過程詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解
這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解,在Springboot中定時(shí)任務(wù)是一項(xiàng)經(jīng)常能用到的功能,實(shí)現(xiàn)定時(shí)任務(wù)的方式有很多,今天來介紹常用的幾種,需要的朋友可以參考下2023-11-11
Spring?框架的?MethodInterceptor?簡(jiǎn)介及示例代碼
MethodInterceptor接口定義了一個(gè)方法Object?intercept(Object?obj,?Method?method,?Object[]?args,?MethodProxy?proxy)?,該方法在代理對(duì)象的方法被調(diào)用時(shí)被觸發(fā),這篇文章主要介紹了Spring?框架的?MethodInterceptor?簡(jiǎn)介及示例代碼,需要的朋友可以參考下2023-09-09
mybatis 映射文件中if標(biāo)簽判斷字符串相等的兩種方式
這篇文章主要介紹了mybatis 映射文件中if標(biāo)簽判斷字符串相等的方式,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06

