Объединить два изображения с разным размером
У меня есть два изображения с разными размерами. Я хочу объединить эти два изображения, чтобы передние изображения правильно накладывались на фоновое изображение.
спереди: (ширина:227 высота:238)
В настоящее время мой результат выглядит следующим образом, но мне нужно, чтобы он наложился идеально
Мой подход Я изменяю размер меньшего изображения на большее. Для этого я использую внешнюю библиотеку с именем imgscalr ( https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib/4.2). Как вы можете видеть, полученное изображение не является правильным, поэтому я попытался масштабировать переднее изображение так, чтобы оно перекрывало фон, также я изменил корень x / y, когда рисую переднее изображение на фоне, но у меня все еще есть разница, Любая идея, как я могу объединить два изображения, чтобы изображение штрихов (спереди) перекрывало фон.
public static byte[] mergeBackgroundWithStrokes(byte[] backgroundImage, byte[] frontImage)
throws IOException, PDProcessingException {
Path backgroundfile = readAllBytes(backgroundImage, "background");
Path outputFile = Files.createTempFile("output", ".png");
BufferedImage backgroundBuffImg = ImageIO.read(backgroundfile.toFile());
BufferedImage frontBuffImg = makeColorTransparent(frontImage, Color.WHITE);
int width = Math.max(backgroundBuffImg.getWidth(), frontBuffImg.getWidth());
int height = Math.max(backgroundBuffImg.getHeight(), frontBuffImg.getHeight());
backgroundBuffImg = resize(backgroundBuffImg, width, height);
//scaling front image
int scaledWidth = (int) ((width));
int scaledHeight = (int) ((height) * 1.02);
frontBuffImg = resize(frontBuffImg, scaledWidth, scaledHeight);
BufferedImage newImage = mergeImages(backgroundBuffImg, frontBuffImg);
ImageIO.write(newImage, "PNG", outputFile.toFile());
return Files.readAllBytes(outputFile);
}
public static BufferedImage resize(BufferedImage img, int width, int height)
{
if (img.getWidth() == width && img.getHeight() == height) {
return img;
} else {
return Scalr.resize(img, width, height);
}
}
public static BufferedImage mergeImages(BufferedImage background, BufferedImage front) {
int width = background.getWidth();
int height = background.getHeight();
BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(background, 0, 0, null);
g.drawImage(front, 15, -10, background.getWidth(), background.getHeight(), 0, 0, width, height, null);
return newImage;
}
Здесь вы можете увидеть полный класс: https://pastebin.com/F4VrBwRv