修改模糊图

dev
zhaokai 2026-03-11 17:35:06 +08:00
parent a071cdd1f3
commit 4c7762a288
2 changed files with 0 additions and 128 deletions

View File

@ -21,7 +21,6 @@ import com.zcloud.edu.domain.model.archives.ClassArchivesE;
import com.zcloud.edu.domain.model.archives.PersonArchivesE;
import com.zcloud.edu.domain.model.study.*;
import com.zcloud.edu.domain.utils.FixedPictureUtils;
import com.zcloud.edu.domain.utils.ImageUtil;
import com.zcloud.edu.dto.archives.ArchivesPdfFilePageQry;
import com.zcloud.edu.dto.archives.ArchivesQry;
import com.zcloud.edu.dto.clientobject.archives.ArchivesPdfFileCO;
@ -425,7 +424,6 @@ public class ArchivesQueryExe {
try {
Map<String, Object> workItem = PropertyUtils.describe( params);
// PictureRenderData picture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
// PictureRenderData picture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), 100, 100);
PictureRenderData picture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), 100, 100);
workItem.put("img", picture);
String templatePath = "templates/template/studentInfo.docx";
@ -444,39 +442,14 @@ public class ArchivesQueryExe {
Map<String, Object> workItem = PropertyUtils.describe( params);
if(!ObjectUtils.isEmpty(params.getSignFaceUrl())){
// PictureRenderData signFacePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
// PictureRenderData signFacePicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), 100, 100);
PictureRenderData signFacePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), 100, 100);
workItem.put("signFacePicture", signFacePicture);
}
if (!ObjectUtils.isEmpty(params.getExamSignFaceUrl())) {
// PictureRenderData examSignFacePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
// PictureRenderData examSignFacePicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), 100, 100);
PictureRenderData examSignFacePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), 100, 100);
workItem.put("examSignFacePicture", examSignFacePicture);
// String imageUrl = fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl();
// try (InputStream is = new URL(imageUrl).openStream()) {
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
//
// // Thumbnailator 自动处理 EXIF 方向,并缩放到 100x100保持比例
// Thumbnails.of(is)
// .keepAspectRatio(true) // 可选:保持比例,避免拉伸
// .outputFormat("JPEG")
// .toOutputStream(baos);
//
// byte[] imageBytes = baos.toByteArray();
// ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
// PictureRenderData picture = Pictures.ofStream(bis)
// .size(100, 100)
// .create();
//
// workItem.put("examSignFacePicture", picture);
// } catch (Exception e) {
// e.printStackTrace();
// // 可选:插入默认占位图
// // workItem.put("examSignFacePicture", defaultPicture);
// }
}
BigDecimal videoTotalTime = params.getVideoTotalTime();
String templatePath = "templates/template/studyRecord.docx";
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
@ -527,11 +500,9 @@ public class ArchivesQueryExe {
workItem.put("className", params.getClassName());
if(!ObjectUtils.isEmpty(params.getStudentExamRecord().getSignUrl())){
// PictureRenderData signPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), PictureType.JPEG).size(50, 15).create();//网络图片地址
// PictureRenderData signPicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), 50, 25);
PictureRenderData signPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), 50, 25);
workItem.put("signPicture", signPicture);
}
// log.info("考试试卷下载,{}",JSONUtil.toJsonStr(workItem));
String templatePath = "templates/template/exam.docx";
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
return outputStream.toByteArray();
@ -539,7 +510,6 @@ public class ArchivesQueryExe {
e.printStackTrace();
log.error("execteExamRecord,整理数据失败",e);
return null;
// throw new BizException("导出失败");
}
}
@ -887,7 +857,6 @@ public class ArchivesQueryExe {
for (StudentSignCO item : params.getSignList()){
Map<String, Object> itemMap = PropertyUtils.describe(item);
// PictureRenderData picture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
// PictureRenderData picture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), 100, 100);
PictureRenderData picture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), 100, 100);
itemMap.put("picture", picture);
int index = atomicIndex.getAndIncrement();
@ -921,21 +890,15 @@ public class ArchivesQueryExe {
item.setUserIdCard(userIdCardString);
Map<String, Object> itemMap = PropertyUtils.describe(item);
if(!ObjectUtils.isEmpty(item.getSignFaceUrl())){
// PictureRenderData signPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), PictureType.JPEG).size(50, 50).create();//网络图片地址
// PictureRenderData signPicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), 50, 50);
PictureRenderData signPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), 50, 50);
itemMap.put("signPicture", signPicture);
}
if(!ObjectUtils.isEmpty(item.getExamFaceUrl())){
// PictureRenderData examPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), PictureType.JPEG).size(50, 50).create();//网络图片地址
// PictureRenderData examPicture = ImageUtil.createWithThumbnailator(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), 50, 50);
PictureRenderData examPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), 50, 50);
itemMap.put("examPicture", examPicture);
}
if(!ObjectUtils.isEmpty(item.getUserAvatarUrl())){
// PictureRenderData facePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getUserAvatarUrl(), PictureType.JPEG).size(50, 50).style("rotation:90;").create();//网络图片地址
PictureRenderData facePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getUserAvatarUrl(), 50, 50);
itemMap.put("facePicture", facePicture);

View File

@ -1,91 +0,0 @@
package com.zcloud.edu.domain.utils;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import net.coobird.thumbnailator.Thumbnails;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.net.URL;
import com.drew.imaging.ImageMetadataReader;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifIFD0Directory;
import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
public class ImageUtil {
public static PictureRenderData createWithThumbnailator(String imageUrl, int width, int height) {
try {
URL url = new URL(imageUrl);
BufferedImage originalImage = ImageIO.read(url);
int rotationAngle = getRotationAngleFromExif(url);
// 使用Thumbnailator的增强配置
Thumbnails.Builder<BufferedImage> builder = Thumbnails.of(originalImage)
.size(width, height)
.outputQuality(1.0) // 最高质量
.imageType(BufferedImage.TYPE_INT_RGB) // 确保RGB类型
.useOriginalFormat() // 保持原始格式
.allowOverwrite(true); // 允许覆盖
// 设置缩放算法
if (width * height > 100000) { // 大图使用双三次插值
builder.scalingMode(ScalingMode.BICUBIC);
} else {
builder.scalingMode(ScalingMode.BILINEAR);
}
BufferedImage processedImage;
if (rotationAngle != 0) {
processedImage = builder.rotate(rotationAngle).asBufferedImage();
} else {
processedImage = builder.asBufferedImage();
}
// 使用ImageIO写入设置更高的质量参数
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(processedImage, "jpg", baos);
return Pictures.ofBytes(baos.toByteArray(), PictureType.JPEG)
.size(width, height)
.create();
} catch (Exception e) {
e.printStackTrace();
return Pictures.ofUrl(imageUrl, PictureType.JPEG)
.size(width, height)
.create();
}
}
/**
* EXIF
* 0-90/180/270-
*/
private static int getRotationAngleFromExif(URL url) {
try {
Metadata metadata = ImageMetadataReader.readMetadata(url.openStream());
ExifIFD0Directory exifDir = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
if (exifDir != null && exifDir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
int orientation = exifDir.getInt(ExifIFD0Directory.TAG_ORIENTATION);
// 根据Orientation值返回需要的旋转角度 [citation:9]
switch (orientation) {
case 3: // 需要旋转180度
return 180;
case 6: // 需要顺时针旋转90度最常见手机竖拍
return 90;
case 8: // 需要逆时针旋转90度
return 270;
default: // 1或其他不需要旋转
return 0;
}
}
} catch (Exception e) {
// 忽略EXIF读取错误返回0表示不旋转
}
return 0;
}
}