package my.example.image;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import javax.imageio.ImageIO;
public class ImageInRectange {
public static void main(String[] args) throws IOException {
createImageInRectagle(512, 1024, new File("./src/main/resources/chelsea.png"));
}
public static File createImageInRectagle(int width, int height, File image) throws IOException {
Image originImage = ImageIO.read(image);
int oImgWidth = originImage.getWidth(null);
int oImgHeight = originImage.getHeight(null);
float imageRatio = (float) oImgHeight / oImgWidth;
float rectangleRatio = (float) width / height;
BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
BufferedImage bufferedImage = ImageIO.read(image);
Graphics g2 = combined.getGraphics();
Point p = new Point(0, 0);
if (Math.abs(imageRatio - rectangleRatio) < 0.05) {
bufferedImage = scale(bufferedImage, width, height);
p.x = 0;
p.y = 0;
} else {
int minEdge = width < height ? width : height;
if (oImgHeight > oImgWidth) {
float diff = (float) oImgHeight / minEdge;
int newWidth = Math.round(oImgWidth / diff);
bufferedImage = scale(bufferedImage, newWidth, minEdge);
if (minEdge == height) {
p.x = Math.abs((width - newWidth) / 2);
p.y = 0;
} else {
p.x = 0;
p.y = Math.abs((height - minEdge) / 2);
}
} else {
float diff = (float) oImgWidth / minEdge;
int newHeight = Math.round(oImgHeight / diff);
bufferedImage = scale(bufferedImage, minEdge, newHeight);
if (minEdge == height) {
p.x = Math.abs((width - minEdge) / 2);
p.y = 0;
} else {
p.x = 0;
p.y = Math.abs((height - newHeight) / 2);
}
}
}
g2.drawImage(bufferedImage, p.x, p.y, null);
g2.dispose();
File tempImage = Paths.get("target", "ok.png").toFile();
ImageIO.write(combined, "png", tempImage);
return tempImage;
}
public static BufferedImage scale(BufferedImage imgb, int newWidth, int newHeight) {
Image image;
image = imgb.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
return toBufferedImage(image);
}
public static BufferedImage toBufferedImage(Image img) {
if (img instanceof BufferedImage) {
return (BufferedImage) img;
}
BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();
return bimage;
}
}
You can find source code on Github
No comments:
Post a Comment