"Cклеить" изображения в java

Имеется 30 фотографий в формате .png (это фотографии с ресурса api.nasa.gov за месяц). Нужно в java объединить, т.е. "склеить" их в одну картинку вертикально, т.е. одну под другой. Мой код позволяет "склеить" только максимум три фотографии. К сожалению, придумать код, который "склеивает" все тридцать фотографий (а не три) мне не удалось. Если кто-то подскажет, как поправить мой код, буду очень благодарен. Спасибо. Вот мой код:

class JoinedImages {
public static void joinedImages() throws IOException {
    // Объединяем все фото в одну картинку
    int rows = 3;
    int cols = 1;
    int chunks = rows * cols;

    int chunkWidth, chunkHeight;
    int type;

    File[] imgFiles = new File("NASA_Photos_Of_Month").listFiles();

    // Создаем BufferedImage массив из имеющихся в списке фотографий
    BufferedImage[] buffImages = new BufferedImage[chunks];
    for (int i = 0; i < chunks; i++) {
        assert imgFiles != null;
        buffImages[i] = ImageIO.read(imgFiles[i]);
    }
    type = buffImages[0].getType();
    chunkWidth = buffImages[0].getWidth();
    chunkHeight = buffImages[0].getHeight();

    // Инициализируем finalImg
    BufferedImage finalImg = new BufferedImage(chunkWidth * cols, chunkHeight * rows, type);

    int num = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            finalImg.createGraphics().drawImage(buffImages[num], chunkWidth * j, chunkHeight * i, null);
            num++;
        }
    }
    System.out.println("Изображения объединены в папке 'Joined_Images', файл 'Joined_Photos.png'");
    ImageIO.write(finalImg, "png", new File("Joined_Images\\Joined_Photos.png"));
}

}


Ответы (1 шт):

Автор решения: anonymus

Попробуйте

Этот код считывает все изображения в папке, проверяет их формат (только PNG), определяет итоговые размеры для объединенного изображения, затем по очереди добавляет каждое изображение, перемещаясь по вертикали. После чего он сохраняет результаты в указанной папке.

Убедитесь, что в каталоге NASA_Photos_Of_Month нет других файлов, кроме изображений, которые нужно объединить, иначе возможны ошибки. Фильтр (dir, name) -> name.toLowerCase().endsWith(".png") предназначен для отбора только файлов с расширением .png.

Если изображения имеют различные размеры, вам потребуется дополнительный алгоритм для их масштабирования до одного размера перед объединением.

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class JoinedImages {
    public static void joinedImages() throws IOException {
        File imgFolder = new File("NASA_Photos_Of_Month");
        File[] imgFiles = imgFolder.listFiles((dir, name) -> name.toLowerCase().endsWith(".png"));
        
        if (imgFiles == null || imgFiles.length == 0) {
            System.out.println("Каталог пуст или не существует.");
            return;
        }

        // Читаем первую картинку, чтобы получить ширину и тип
        BufferedImage sampleImage = ImageIO.read(imgFiles[0]);
        int width = sampleImage.getWidth();
        int height = sampleImage.getHeight();
        int type = sampleImage.getType();

        // Инициализируем finalImg с общей высотой, равной суммарной высоте всех изображений
        BufferedImage finalImg = new BufferedImage(width, height * imgFiles.length, type);

        int yCoord = 0;
        for (File imgFile : imgFiles) {
            BufferedImage img = ImageIO.read(imgFile);
            finalImg.createGraphics().drawImage(img, 0, yCoord, null);
            yCoord += height;
        }

        // Сохраняем полученное изображение
        File outputFolder = new File("Joined_Images");
        if (!outputFolder.exists()) {
            outputFolder.mkdir();
        }
        File outputFile = new File(outputFolder, "Joined_Photos.png");
        ImageIO.write(finalImg, "png", outputFile);

        System.out.println("Изображения объединены и сохранены в " + outputFile.getAbsolutePath());
    }

    public static void main(String[] args) {
        try {
            joinedImages();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
→ Ссылка