сшить изображения вместе в Java - PullRequest
3 голосов
/ 14 мая 2011

Я пытаюсь сшить некоторые изображения, используя Java.У меня есть куча изображений, которые я хотел бы соединить вместе, и все они имеют одинаковые размеры, так что я полагаю, что на самом деле это просто вопрос выравнивания их рядом друг с другом.У меня это работает, но это очень медленно и, вероятно, очень интенсивно использует память.Мне интересно, есть ли более простой способ:

public static void main(String[] args) throws IOException
    {
        int dim = 256;
        BufferedImage merged = null;
        for(int y = 0; y<10;y++)
        {
            for(int x = 0; x<10;x++)
            {
                URL url = new URL(someURL);
                BufferedImage nextImage = ImageIO.read(url);
                if(merged==null)
                    merged=nextImage;
                else
                {
                    BufferedImage tempMerged;
                    tempMerged = new BufferedImage(10*dim,10*dim,merged.getType());
                    //Write first image
                    for(int xx=0;xx<merged.getWidth();xx++)
                        for(int yy=0;yy<merged.getHeight();yy++)
                            tempMerged.setRGB(xx,yy,merged.getRGB(xx,yy));
                    //Write img2
                    for(int xx=0;xx<dim;xx++)
                    {
                        for(int yy=0;yy<dim;yy++)
                        {
                            int destX = (x*dim)+xx;
                            int destY = (y*dim)+yy;
                            tempMerged.setRGB(destX,destY,nextImage.getRGB(xx,yy));
                        }
                    }
                    merged=tempMerged;
                }
                System.out.println("Stitched image at "+x+","+y);
            }
        }
        ImageIO.write(merged, "png", new File("merged.png"));
    }

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

@ Томас: Вам нужно будет создать новое изображение в два раза больше исходного размера (например, для 2x 512x512 новое изображение должно быть 512x1024 или 1024x512). Затем вы должны визуализировать исходные изображения в соответствующей области / прямоугольнике целевого изображения

например. TiledImageWrite.java

import java.awt.image.BufferedImage;
import java.awt.*;
import javax.swing.*;
import java.net.URL;
import java.io.File;
import javax.imageio.ImageIO;

class TiledImageWrite {

    public static void main(String[] args) throws Exception {

        URL dayStromloUrl = new URL("http://pscode.org/media/stromlo1.jpg");
        URL nightStromloUrl = new URL("http://pscode.org/media/stromlo2.jpg");
        final BufferedImage dayStromloImage = ImageIO.read(dayStromloUrl);
        final BufferedImage nightStromloImage = ImageIO.read(nightStromloUrl);

        final int width = dayStromloImage.getWidth();
        final int height = dayStromloImage.getHeight();;

        final BufferedImage columnImage =
            new BufferedImage(width,2*height,BufferedImage.TYPE_INT_RGB);
        final BufferedImage rowImage =
        new BufferedImage(2*width,height,BufferedImage.TYPE_INT_RGB);

        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(3,3));

                Graphics2D g2dColumn = columnImage.createGraphics();
                g2dColumn.drawImage(dayStromloImage,0,0, null);
                // start this one at 'height' down the final image
                g2dColumn.drawImage(nightStromloImage,0,height, null);

                Graphics2D g2dRow = rowImage.createGraphics();
                g2dRow.drawImage(dayStromloImage,0,0, null);
                // start this one at 'width' across the final image
                g2dRow.drawImage(nightStromloImage,width,0, null);

                gui.add(new JLabel(new ImageIcon(columnImage)),BorderLayout.CENTER);
                gui.add(new JLabel(new ImageIcon(rowImage)),BorderLayout.SOUTH);

                JOptionPane.showMessageDialog(null, gui);
            }
        } );

        ImageIO.write(columnImage, "png", new File("column.png"));
        ImageIO.write(rowImage, "png", new File("row.png"));
    }
}

column.png

Images in a column

2 голосов
/ 14 мая 2011

AFAIK, что вы делаете здесь, чтобы записать слои в изображение.Однако формат png не поддерживает это.

Вам необходимо создать новое изображение, в два раза превышающее размер исходных изображений (например, для 2x 512x512 новое изображение должно быть 512x1024 или 1024x512).Затем вы должны отобразить исходные изображения в соответствующей области / прямоугольнике целевого изображения.

0 голосов
/ 14 мая 2011

Я понял, почему это идет медленно.На самом деле, я не хотел объединять изображения, а собирал кучу изображений.Что я делал, так это переписывал исходное изображение, когда все, что я действительно хотел сделать, это добавить к нему.Теперь намного быстрее!

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