import javax.imageio.ImageTypeSpecifier;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
public class ImageUtil {
public static BufferedImage getScaledInstanceClipMaxSide(BufferedImage bufferedImage, int width, int height) {
BufferedImage bufferedImage1 = clipMaxSide(bufferedImage, width * 1.0 / height);
return getScaledInstance(bufferedImage1, width, height);
}
public static BufferedImage clipMaxSide(BufferedImage bufferedImage, double widthHeightPct) {
double curPct = bufferedImage.getWidth() * 1.0 / bufferedImage.getHeight();
int targetWidth;
int targetHeight;
int x, y;
if (curPct > widthHeightPct) {//更宽
targetWidth = (int) (bufferedImage.getHeight() * widthHeightPct);
targetHeight = bufferedImage.getHeight();
x = (bufferedImage.getWidth() - targetWidth) / 2;
y = 0;
} else {//更高
targetWidth = bufferedImage.getWidth();
targetHeight = (int) (bufferedImage.getWidth() / widthHeightPct);
x = 0;
y = (bufferedImage.getHeight() - targetHeight) / 2;
}
return bufferedImage.getSubimage(x, y, targetWidth, targetHeight);
}
public static BufferedImage getScaledInstance(BufferedImage source, int width, int height) {
BufferedImage target = ImageTypeSpecifier.createFromRenderedImage(source).createBufferedImage(width, height);
Graphics g = target.getGraphics();
g.drawImage(source, 0, 0, width, height, (ImageObserver) null);
g.dispose();
return target;
}
public static BufferedImage createThumbnail(BufferedImage image, int newWidth, int newHeight) {
int width = image.getWidth();
int height = image.getHeight();
boolean isTranslucent = true;
if (newWidth < width && newHeight < height) {
if (newWidth > 0 && newHeight > 0) {
BufferedImage thumb = image;
BufferedImage temp = null;
Graphics2D g2 = null;
try {
int previousWidth = width;
int previousHeight = height;
do {
if (width > newWidth) {
width /= 2;
if (width < newWidth) {
width = newWidth;
}
}
if (height > newHeight) {
height /= 2;
if (height < newHeight) {
height = newHeight;
}
}
if (temp == null || isTranslucent) {
if (g2 != null) {
g2.dispose();
}
temp = new BufferedImage(width, height, 6);
g2 = temp.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
}
g2.drawImage(thumb, 0, 0, width, height, 0, 0, previousWidth, previousHeight, (ImageObserver) null);
previousWidth = width;
previousHeight = height;
thumb = temp;
} while (width != newWidth || height != newHeight);
} finally {
if (g2 != null) {
g2.dispose();
}
}
if (width != thumb.getWidth() || height != thumb.getHeight()) {
temp = new BufferedImage(width, height, 6);
g2 = temp.createGraphics();
try {
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(thumb, 0, 0, width, height, 0, 0, width, height, (ImageObserver) null);
} finally {
g2.dispose();
}
thumb = temp;
}
return thumb;
} else {
throw new IllegalArgumentException("newWidth and newHeight must be greater than 0");
}
} else {
throw new IllegalArgumentException("newWidth and newHeight cannot be greater than the image dimensions");
}
}
}