package org.springblade.modules.resource.utils;
|
import lombok.extern.slf4j.Slf4j;
|
import javax.imageio.ImageIO;
|
import javax.swing.*;
|
import java.awt.*;
|
import java.awt.geom.AffineTransform;
|
import java.awt.image.AffineTransformOp;
|
import java.awt.image.BufferedImage;
|
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayOutputStream;
|
import java.net.URL;
|
|
/**
|
* @author arsn
|
* @className ImageUtil
|
* @Description 图片缩放
|
**/
|
@Slf4j
|
public class ImageUtil {
|
/**
|
* 缩放比例系数
|
*/
|
private static double SCALING = 0.56;
|
/**
|
* 符合base64的宽
|
*/
|
private static int MAX_WIDTH = 560;
|
/**
|
* 最大高
|
*/
|
private static int MAX_HEIGHT = 1000;
|
|
/**
|
* @Author 小帅丶
|
* @Description 根据图片公网地址转BufferedImage
|
* @Date 2020/9/29 10:52
|
* @param url 图片公网地址
|
* @return java.awt.image.BufferedImage
|
**/
|
public static BufferedImage imgUrlConvertBufferedImage(String url) throws Exception {
|
URL urls = new URL(url);
|
Image image = Toolkit.getDefaultToolkit().getImage(urls);
|
BufferedImage bufferedImage = toBufferedImage(image);
|
return bufferedImage;
|
}
|
/**
|
* @Author 小帅丶
|
* @Description 根据BufferedImage处理图片并返回byte[]
|
* @Date 2020/9/29 10:55
|
* @param bufferedImage
|
* @return byte[]
|
**/
|
public static byte[] zoomImageByte(BufferedImage bufferedImage) throws Exception {
|
ByteArrayOutputStream outputStreamZoom = new ByteArrayOutputStream();
|
ByteArrayOutputStream outputStreamSource = new ByteArrayOutputStream();
|
ImageIO.write(bufferedImage, "jpg", outputStreamSource);
|
BufferedImage bufferedImageZoom = zoomImage(outputStreamSource.toByteArray());
|
//写入缩减后的图片
|
ImageIO.write(bufferedImageZoom, "jpg", outputStreamZoom);
|
return outputStreamZoom.toByteArray();
|
}
|
|
/**
|
* @Author 小帅丶
|
* @Description 根据byte[]处理图片并返回byte[]
|
* @Date 2020/9/29 10:55
|
* @param src
|
* @return byte[]
|
**/
|
public static byte[] zoomImageByte(byte[] src) throws Exception {
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
BufferedImage bufferedImage = zoomImage(src);
|
//写入缩减后的图片
|
ImageIO.write(bufferedImage, "jpg", outputStream);
|
return outputStream.toByteArray();
|
}
|
|
/**
|
* 图片缩放 仅适用于微信内容图片安全检测使用
|
*
|
* @param src 为源文件byte
|
*/
|
public static BufferedImage zoomImage(byte[] src) throws Exception {
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
ByteArrayInputStream in = new ByteArrayInputStream(src);
|
double wr = 0, hr = 0;
|
BufferedImage bufferedImage = null;
|
//读取图片
|
BufferedImage bufImg = ImageIO.read(in);
|
int height = bufImg.getHeight();
|
int width = bufImg.getWidth();
|
int cHeight = height;
|
int cWidth = width;
|
double Scaling = width / height;
|
if (Scaling < SCALING) {
|
if (height > MAX_HEIGHT) {
|
cHeight = MAX_HEIGHT;
|
cWidth = (width * MAX_HEIGHT) / height;
|
}
|
//以宽为缩放比例
|
} else {
|
if (width > MAX_WIDTH) {
|
cWidth = MAX_WIDTH;
|
cHeight = (height * MAX_WIDTH) / width;
|
}
|
}
|
//获取缩放后的宽高
|
log.info("宽{},高{}", cWidth, cHeight);
|
//设置缩放目标图片模板
|
Image Itemp = bufImg.getScaledInstance(width, cHeight, BufferedImage.SCALE_SMOOTH);
|
//获取缩放比例
|
wr = cWidth * 1.0 / width;
|
hr = cHeight * 1.0 / height;
|
log.info("宽比例{},高比例{}", wr, hr);
|
AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);
|
Itemp = ato.filter(bufImg, null);
|
try {
|
//写入缩减后的图片
|
ImageIO.write((BufferedImage) Itemp, "jpg", outputStream);
|
ByteArrayInputStream inNew = new ByteArrayInputStream(outputStream.toByteArray());
|
bufferedImage = ImageIO.read(inNew);
|
} catch (Exception ex) {
|
log.info("缩放图片异常{}", ex.getMessage());
|
} finally {
|
if (null != outputStream) {
|
outputStream.close();
|
}
|
if (null != in) {
|
in.close();
|
}
|
}
|
return bufferedImage;
|
}
|
|
/**
|
* @Description Image转BufferedImage
|
* @param image 通过url获取的image对象
|
* @return java.awt.image.BufferedImage
|
**/
|
public static BufferedImage toBufferedImage(Image image) {
|
if (image instanceof BufferedImage) {
|
return (BufferedImage) image;
|
}
|
// This code ensures that all the pixels in the image are loaded
|
image = new ImageIcon(image).getImage();
|
BufferedImage bimage = null;
|
GraphicsEnvironment ge = GraphicsEnvironment
|
.getLocalGraphicsEnvironment();
|
try {
|
int transparency = Transparency.OPAQUE;
|
GraphicsDevice gs = ge.getDefaultScreenDevice();
|
GraphicsConfiguration gc = gs.getDefaultConfiguration();
|
bimage = gc.createCompatibleImage(image.getWidth(null),
|
image.getHeight(null), transparency);
|
} catch (HeadlessException e) {
|
// The system does not have a screen
|
}
|
if (bimage == null) {
|
// Create a buffered image using the default color model
|
int type = BufferedImage.TYPE_INT_RGB;
|
bimage = new BufferedImage(image.getWidth(null),
|
image.getHeight(null), type);
|
}
|
// Copy image to buffered image
|
Graphics g = bimage.createGraphics();
|
// Paint the image onto the buffered image
|
g.drawImage(image, 0, 0, null);
|
g.dispose();
|
return bimage;
|
}
|
}
|