New way of rescaling images

This commit is contained in:
Corsin Ragettli 2021-10-19 22:43:19 +02:00
parent 193674d6f0
commit b5295707bb

View file

@ -8,8 +8,12 @@ import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.*; import java.io.*;
import java.net.URL; import java.net.URL;
import java.util.HashMap; import java.util.HashMap;
@ -115,22 +119,22 @@ public class EmoteAddCommand extends Command {
private byte[] resizeImage(byte[] bytes, String format, int size) throws IOException { private byte[] resizeImage(byte[] bytes, String format, int size) throws IOException {
reply("Image size too big (" + bytes.length / 1000 + "kB). Resizing image..."); reply("Image size too big (" + bytes.length / 1000 + "kB). Resizing image...");
Image image = ImageIO.read(new ByteArrayInputStream(bytes)); BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
double ratio = (double)image.getHeight(null) / (double)image.getWidth(null); double ratio = (double) image.getHeight(null) / (double) image.getWidth(null);
image = image.getScaledInstance(size, (int) (size * ratio), Image.SCALE_SMOOTH); // Resize the image with the correct ratio
ByteArrayOutputStream out = new ByteArrayOutputStream(); AffineTransform trm = new AffineTransform();
trm.scale(size / (double) image.getHeight(), (image.getHeight() * ratio) / image.getHeight());
final AffineTransformOp operation = new AffineTransformOp(trm, AffineTransformOp.TYPE_BILINEAR);
BufferedImage newImage = new BufferedImage(size, (int) (size * ratio), BufferedImage.TYPE_INT_ARGB);
newImage = operation.filter(image, newImage);
BufferedImage bufferedImg = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); ByteArrayOutputStream baos = new ByteArrayOutputStream();
Graphics2D bGr = bufferedImg.createGraphics(); ImageIO.write(newImage, format, baos);
bGr.drawImage(image, 0, 0, null); byte[] newBytes = baos.toByteArray();
bGr.dispose();
ImageIO.write(bufferedImg, format, out); if(newBytes.length > MAX_EMOTE_SIZE)
bytes = out.toByteArray(); newBytes = resizeImage(newBytes, format, size - 100);
if (bytes.length > MAX_EMOTE_SIZE) {
return resizeImage(bytes, format, size - 100); return newBytes;
} else {
return bytes;
}
} }
} }