修改模糊图
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.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);
|
||||
|
|
|
|||
|
|
@ -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