Объедините два изображения разного размера, чтобы они правильно перекрывались - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть два изображения с разными размерами. Я хочу объединить эти два изображения, чтобы передние изображения правильно накладывались на фоновое изображение.

фон (ширина: 144 высота: 147): enter image description here

спереди: (ширина: 227, высота: 238) enter image description here

В настоящее время мой результат выглядит следующим образом, но мне нужно, чтобы он идеально наложился enter image description here

Мой подход такой. Я изменяю размер меньшего изображения на большее. Для этого я использую внешнюю библиотеку с именем 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

...