3 Stimmen

bilder in java zusammenfügen

Ich versuche, einige Bilder mit Java zusammenzufügen. Ich habe eine Reihe von Bildern, die ich zusammenfügen möchte, und sie haben alle die gleichen Abmessungen, so dass es eigentlich nur darum geht, sie nebeneinander zu platzieren, nehme ich an. Ich habe es geschafft, aber es ist sehr langsam und wahrscheinlich sehr speicherintensiv. Ich frage mich, ob es einen einfacheren Weg gibt:

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"));
    }

3voto

Andrew Thompson Punkte 166383

@Thomas: Du müsstest ein neues Bild mit der doppelten Größe der Quellbilder erstellen (z.B. für 2x 512x512 sollte das neue Bild 512x1024 oder 1024x512 sein). Dann renderst du die Quellbilder in den entsprechenden Bereich/Rechteck des Zielbildes

Z.B. 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("https://i.stack.imgur.com/OVOg3.jpg");
        URL nightStromloUrl = new URL("https://i.stack.imgur.com/lxthA.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"));
    }
}

spalte.png

Images in a column

2voto

Thomas Punkte 84982

AFAIK, was Sie hier tun, ist das Schreiben von Ebenen in ein Bild. Das png-Format unterstützt dies jedoch nicht.

Sie müssen ein neues Bild mit der doppelten Größe der Quellbilder erstellen (z.B. für 2x 512x512 sollte das neue Bild 512x1024 oder 1024x512 sein). Dann rendern Sie die Quellbilder in den entsprechenden Bereich/Rechteck des Zielbildes.

0voto

JPC Punkte 7896

Ich habe herausgefunden, warum es so langsam ging. In Wirklichkeit wollte ich keine Bilder zusammenführen, sondern eine Reihe von Bildern zusammensetzen. Dabei habe ich das ursprüngliche Bild komplett neu geschrieben, obwohl ich es eigentlich nur ergänzen wollte. Jetzt geht es viel schneller!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X