修改模糊图
parent
a071cdd1f3
commit
4c7762a288
|
|
@ -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.archives.PersonArchivesE;
|
||||||
import com.zcloud.edu.domain.model.study.*;
|
import com.zcloud.edu.domain.model.study.*;
|
||||||
import com.zcloud.edu.domain.utils.FixedPictureUtils;
|
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.ArchivesPdfFilePageQry;
|
||||||
import com.zcloud.edu.dto.archives.ArchivesQry;
|
import com.zcloud.edu.dto.archives.ArchivesQry;
|
||||||
import com.zcloud.edu.dto.clientobject.archives.ArchivesPdfFileCO;
|
import com.zcloud.edu.dto.clientobject.archives.ArchivesPdfFileCO;
|
||||||
|
|
@ -425,7 +424,6 @@ public class ArchivesQueryExe {
|
||||||
try {
|
try {
|
||||||
Map<String, Object> workItem = PropertyUtils.describe( params);
|
Map<String, Object> workItem = PropertyUtils.describe( params);
|
||||||
// PictureRenderData picture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
|
// 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);
|
PictureRenderData picture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getUserAvatarUrl(), 100, 100);
|
||||||
workItem.put("img", picture);
|
workItem.put("img", picture);
|
||||||
String templatePath = "templates/template/studentInfo.docx";
|
String templatePath = "templates/template/studentInfo.docx";
|
||||||
|
|
@ -444,39 +442,14 @@ public class ArchivesQueryExe {
|
||||||
Map<String, Object> workItem = PropertyUtils.describe( params);
|
Map<String, Object> workItem = PropertyUtils.describe( params);
|
||||||
if(!ObjectUtils.isEmpty(params.getSignFaceUrl())){
|
if(!ObjectUtils.isEmpty(params.getSignFaceUrl())){
|
||||||
// PictureRenderData signFacePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
|
// 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);
|
PictureRenderData signFacePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getSignFaceUrl(), 100, 100);
|
||||||
workItem.put("signFacePicture", signFacePicture);
|
workItem.put("signFacePicture", signFacePicture);
|
||||||
}
|
}
|
||||||
if (!ObjectUtils.isEmpty(params.getExamSignFaceUrl())) {
|
if (!ObjectUtils.isEmpty(params.getExamSignFaceUrl())) {
|
||||||
// PictureRenderData examSignFacePicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
|
// 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);
|
PictureRenderData examSignFacePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getExamSignFaceUrl(), 100, 100);
|
||||||
workItem.put("examSignFacePicture", examSignFacePicture);
|
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";
|
String templatePath = "templates/template/studyRecord.docx";
|
||||||
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
|
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
|
||||||
|
|
@ -527,11 +500,9 @@ public class ArchivesQueryExe {
|
||||||
workItem.put("className", params.getClassName());
|
workItem.put("className", params.getClassName());
|
||||||
if(!ObjectUtils.isEmpty(params.getStudentExamRecord().getSignUrl())){
|
if(!ObjectUtils.isEmpty(params.getStudentExamRecord().getSignUrl())){
|
||||||
// PictureRenderData signPicture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), PictureType.JPEG).size(50, 15).create();//网络图片地址
|
// 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);
|
PictureRenderData signPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + params.getStudentExamRecord().getSignUrl(), 50, 25);
|
||||||
workItem.put("signPicture", signPicture);
|
workItem.put("signPicture", signPicture);
|
||||||
}
|
}
|
||||||
// log.info("考试试卷下载,{}",JSONUtil.toJsonStr(workItem));
|
|
||||||
String templatePath = "templates/template/exam.docx";
|
String templatePath = "templates/template/exam.docx";
|
||||||
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
|
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
|
||||||
return outputStream.toByteArray();
|
return outputStream.toByteArray();
|
||||||
|
|
@ -539,7 +510,6 @@ public class ArchivesQueryExe {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
log.error("execteExamRecord,整理数据失败",e);
|
log.error("execteExamRecord,整理数据失败",e);
|
||||||
return null;
|
return null;
|
||||||
// throw new BizException("导出失败");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -887,7 +857,6 @@ public class ArchivesQueryExe {
|
||||||
for (StudentSignCO item : params.getSignList()){
|
for (StudentSignCO item : params.getSignList()){
|
||||||
Map<String, Object> itemMap = PropertyUtils.describe(item);
|
Map<String, Object> itemMap = PropertyUtils.describe(item);
|
||||||
// PictureRenderData picture = Pictures.ofUrl(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
|
// 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);
|
PictureRenderData picture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getSignUrl(), 100, 100);
|
||||||
itemMap.put("picture", picture);
|
itemMap.put("picture", picture);
|
||||||
int index = atomicIndex.getAndIncrement();
|
int index = atomicIndex.getAndIncrement();
|
||||||
|
|
@ -921,21 +890,15 @@ public class ArchivesQueryExe {
|
||||||
item.setUserIdCard(userIdCardString);
|
item.setUserIdCard(userIdCardString);
|
||||||
Map<String, Object> itemMap = PropertyUtils.describe(item);
|
Map<String, Object> itemMap = PropertyUtils.describe(item);
|
||||||
if(!ObjectUtils.isEmpty(item.getSignFaceUrl())){
|
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);
|
PictureRenderData signPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getSignFaceUrl(), 50, 50);
|
||||||
|
|
||||||
itemMap.put("signPicture", signPicture);
|
itemMap.put("signPicture", signPicture);
|
||||||
}
|
}
|
||||||
if(!ObjectUtils.isEmpty(item.getExamFaceUrl())){
|
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);
|
PictureRenderData examPicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getExamFaceUrl(), 50, 50);
|
||||||
|
|
||||||
itemMap.put("examPicture", examPicture);
|
itemMap.put("examPicture", examPicture);
|
||||||
}
|
}
|
||||||
if(!ObjectUtils.isEmpty(item.getUserAvatarUrl())){
|
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);
|
PictureRenderData facePicture = FixedPictureUtils.ofNormalUrl(fileUrlConfig.getPrefixUrl() + item.getUserAvatarUrl(), 50, 50);
|
||||||
|
|
||||||
itemMap.put("facePicture", facePicture);
|
itemMap.put("facePicture", facePicture);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue