"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 шт):
Попробуйте
Этот код считывает все изображения в папке, проверяет их формат (только 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();
}
}
}