图片调整
parent
bef972ca0d
commit
a64fcc6f29
|
|
@ -12,32 +12,39 @@ import java.net.URL;
|
||||||
import com.drew.imaging.ImageMetadataReader;
|
import com.drew.imaging.ImageMetadataReader;
|
||||||
import com.drew.metadata.Metadata;
|
import com.drew.metadata.Metadata;
|
||||||
import com.drew.metadata.exif.ExifIFD0Directory;
|
import com.drew.metadata.exif.ExifIFD0Directory;
|
||||||
|
import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
|
||||||
|
|
||||||
public class ImageUtil {
|
public class ImageUtil {
|
||||||
public static PictureRenderData createWithThumbnailator(String imageUrl, int width, int height) {
|
public static PictureRenderData createWithThumbnailator(String imageUrl, int width, int height) {
|
||||||
try {
|
try {
|
||||||
// 下载原图
|
|
||||||
URL url = new URL(imageUrl);
|
URL url = new URL(imageUrl);
|
||||||
BufferedImage originalImage = ImageIO.read(url);
|
BufferedImage originalImage = ImageIO.read(url);
|
||||||
|
|
||||||
// 1. 读取EXIF判断是否需要旋转
|
|
||||||
int rotationAngle = getRotationAngleFromExif(url);
|
int rotationAngle = getRotationAngleFromExif(url);
|
||||||
|
|
||||||
// 2. 根据判断结果决定是否旋转
|
// 使用Thumbnailator的增强配置
|
||||||
BufferedImage processedImage;
|
Thumbnails.Builder<BufferedImage> builder = Thumbnails.of(originalImage)
|
||||||
if (rotationAngle != 0) {
|
|
||||||
// 需要旋转
|
|
||||||
processedImage = Thumbnails.of(originalImage)
|
|
||||||
.size(width, height)
|
.size(width, height)
|
||||||
.rotate(rotationAngle)
|
.outputQuality(1.0) // 最高质量
|
||||||
.asBufferedImage();
|
.imageType(BufferedImage.TYPE_INT_RGB) // 确保RGB类型
|
||||||
|
.useOriginalFormat() // 保持原始格式
|
||||||
|
.allowOverwrite(true); // 允许覆盖
|
||||||
|
|
||||||
|
// 设置缩放算法
|
||||||
|
if (width * height > 100000) { // 大图使用双三次插值
|
||||||
|
builder.scalingMode(ScalingMode.BICUBIC);
|
||||||
} else {
|
} else {
|
||||||
// 不需要旋转,只缩放
|
builder.scalingMode(ScalingMode.BILINEAR);
|
||||||
processedImage = Thumbnails.of(originalImage)
|
|
||||||
.size(width, height)
|
|
||||||
.asBufferedImage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 转换为byte数组
|
BufferedImage processedImage;
|
||||||
|
if (rotationAngle != 0) {
|
||||||
|
processedImage = builder.rotate(rotationAngle).asBufferedImage();
|
||||||
|
} else {
|
||||||
|
processedImage = builder.asBufferedImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用ImageIO写入(设置更高的质量参数)
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
ImageIO.write(processedImage, "jpg", baos);
|
ImageIO.write(processedImage, "jpg", baos);
|
||||||
|
|
||||||
|
|
@ -46,6 +53,7 @@ public class ImageUtil {
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
return Pictures.ofUrl(imageUrl, PictureType.JPEG)
|
return Pictures.ofUrl(imageUrl, PictureType.JPEG)
|
||||||
.size(width, height)
|
.size(width, height)
|
||||||
.create();
|
.create();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue