Java Объединение нескольких изображений в одно большое изображение без наложения - PullRequest
1 голос
/ 21 июля 2011

Я пытаюсь объединить несколько изображений в большое изображение с помощью Java. Все передаваемые изображения имеют высоту 127 x ширина 293. Идея состоит в том, что в метод передается несколько изображений, и метод берет изображения и встраивает их в другое большое изображение. Для более крупного изображения будет макет, в который можно будет ввести в общей сложности 12 возможных изображений, распределенных равномерно (2 строки по 6 изображений, ни один из которых не перекрывается). Если передано менее 12 изображений, то будет заполнено только первое, сколько бы ни было пробелов, остальное изображение будет белым, потому что фон должен быть белым. Когда я запускаю программу, она печатает увеличенное изображение, но заполняет только первое пространство, показывая первое изображение в левом верхнем углу, независимо от того, сколько изображений передано. Также фон имеет розоватый цвет вместо намеченного белого фона , Я только начинающий с Java, поэтому я пытаюсь преодолеть некоторые из этих трудностей обучения. Любой совет, как я мог бы решить мою проблему? (Код скопирован ниже для справки) Спасибо!

public class ImagesCombine {

public String BuildImgs (File[] imgs)throws IOException {
    int arsize = imgs.length;
    File path = new File("Z:/JAVAFiles/Images/");
    BufferedImage page = new BufferedImage(620,900,BufferedImage.TYPE_INT_ARGB);
    Graphics2D paint;
    paint = page.createGraphics();
    paint.setPaint(Color.WHITE);
    paint.fillRect ( 0, 0, page.getWidth(), page.getHeight() ); 
    paint.setBackground(Color.WHITE);
    String tmpname = "";

    for (int i=0;i<imgs.length;i++){

        if(i==0){ 
            Image img0 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img0,0,0,null);
            paint.dispose();
            }
        if(i==1){
            Image img1 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img1,323,0,null);
            paint.dispose();
            }
        if(i==2){
            Image img2 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img2,0,142,null);
            paint.dispose();
            }
        if(i==3){
            BufferedImage img3 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img3,323,142,null);
            paint.dispose();
            }
        if(i==4){
            BufferedImage img4 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img4,0,284,null);
            paint.dispose();
            }
        if(i==5){
            BufferedImage img5 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img5,323,284,null);
            paint.dispose();
            }
        if(i==6){
            BufferedImage img6 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img6,0,426,null);
            paint.dispose();
            }
        if(i==7){
            BufferedImage img7 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img7,323,426,null);
            paint.dispose();
            }
        if(i==8){
            BufferedImage img8 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img8,0,568,null);
            paint.dispose();
            }
        if(i==9){
            BufferedImage img9 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img9,323,568,null);
            paint.dispose();
            }
        if(i==10){
            BufferedImage img10 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img10,0,710,null);
            paint.dispose();
            }
        if(i==11){
            BufferedImage img11 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img11,323,710,null);
            paint.dispose();
            }

        }
    String outpath = "Z:\\JAVAFiles\\" + imgs[0].getName().substring(0,16) + ".jpg";

    OutputStream outfile = new FileOutputStream(outpath);

    JPEGImageEncoder encoder2 = JPEGCodec.createJPEGEncoder(outfile);
    encoder2.encode(page);
    outfile.close();
    return("Success");  
}
}

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

Первое, что я заметил, это то, что вы вызываете dispose() на Graphics2D после каждого рисования изображения. Вероятно, поэтому вы видите только одно изображение, нарисованное на большом изображении. Возьмите этот вызов и поместите его после цикла, и вы должны начать видеть больше изображений.

В качестве примечания вы можете значительно упростить цикл for:

int width = 293;
int height = 127;
for (int i=0; i < Math.min(imgs.length, 12); i++){
    Image image = ImageIO.read(new File(path, imgs[i].getName()));
    int row = i / 6; // This will truncate to 0 or 1.
    int column = i % 6; // Mod will produce the remainder of i / 6 in the range 0-5
    paint.drawImage(image, column * width, row * height, null);
}
0 голосов
/ 21 июля 2011

Создать панель, которая использует GridLayout?Затем вы можете добавить 12 JLabels на панель с каждой меткой, содержащей ImageIcon.Таким образом, менеджер компоновки выполняет всю тяжелую работу по размещению и рисованию изображений.

0 голосов
/ 21 июля 2011

Вы вызываете метод dispose внутри цикла for, поэтому, когда программа завершает первый запуск кода внутри цикла, она затем избавляется от объекта рисования. Когда пришло время во второй раз просмотреть цикл, программа не может найти объект рисования, поэтому она не может ни нарисовать следующее изображение, ни заполнить комнату белым.

Попробуйте использовать метод dispose сразу после закрытия цикла for.

Вы также можете попробовать добавить несколько методов println, чтобы узнать, какую длину возвращает элемент imgs. Обычно вы должны проверять числа внутри переменных, которые вы используете в цикле, чтобы увидеть, получаете ли вы то, что хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...