Bilder zu Collage zusammenstellen

Hallo zusammen,

ich suche eine Lösung für folgendes:

Ich habe angenommen 11 Bilder diese 11 Bilder möchte ich zu einem Bild zusammenfügen indem sie sich überlappen. Man kennt das auch wenn zb 12 CDs in einem Bundler verkauft werden, dann ist auf sind auf dem Title die 12 CDs immer so eins vor dem anderen gesetzt. Hoffe jemand weiß was ich meine :smiley:

Hat jemand ne Idee wie ich das mit Java lösen könnte? Muss dazusagen, dass ich noch nie mit Image -Manipulation zu tun.

Was hast du den bisher ausprobiert?

Normalerweise hast du zwei Buffered Images und zeichnet diese entsprechend versetzt. Dürfte nicht so das Problem sein.

Mach doch mal ein Beispielbild mit einem Malprogramm, dass man sich das besser vorstellen kann.

Ehrlich gesagt hab ich noch nichts weiter versucht, ich wollte mir erstmal einen Überlick verschaffen ob das überhaupt funktioniert. Ich werd mal bissl was testen

Hab mir da nochmal was überlegt, es wäre eigentlich ausreichend alle Bilder in ein Raster zu packen siehe Bild

Problem dabei ist, dass die Quellbilder vermutlich nicht immer die gleichen Maße haben. Hab keinen Plan, wie ich an die Sache ran gehen soll. Hab noch niemals nicht bilder manipuliert 12

BufferedImage und Graphics2D sind deine Freunde um das umzusetzen. Und ich würde auch behaupten, viel Zeit dürfte das nicht benötigen.

Wenn du die Bilder in einem Raster anordnest, und die Bilder haben unterschiedliche Längen und Seitenverhältnisse, dann bleibt dir nichts anderes übrig als die Bilder in ihrem Seitenverhältnis zu skalieren. Das ist relativ einfach

double scaledWidth = something;
double scaledHeight = h * newWidth / w;

wenn du also eine maximale Seitenlänge hast

double maxWidth = something;
double maxHeight = something;

double maxWidthWidthRatio = maxWidth / imageWidth;
double maxHeightHeightRatio = maxHeight / imageHeight;
if( maxWidthWidthRatio > maxHeightHeightRatio ) {
    newImageWidth = maxWidth;
    newImageHeight = h * maxWidthWidthRatio;
} else {
    newImageWidth = w * maxHeightHeightRatio;
    newImageHeight = maxHeight;
}

Dann haben die aber halt Lücken untereinander. Wenn du jetzt versuchst den Platz möglichst effektiv mit unterschiedlich großen Bildern zu füllen, dann haben wir ein Problem. Denn dafür gibt es keine mathematische Lösung.

Ich meine, das geht auch; ist aber ab einer gewissen Eingabegröße nicht mehr in praktikabler Zeit lösbar…

@NicoDeluxe , Bilder skalieren ist in Java etwas „friemelig“, ist aber auch möglich. Es gibt unterschiedliche Skalierungs-Algorithmen (Suchbegriffe, nearest neighbor, bilinear and bicubic interpolation methods).

@TMII Graphics2D kann das…

Klar, aber du musst halt wissen auf welche Größe, damit es in einen definierten Kasten passt, wie von Nico beschrieben.
Vielleicht kann man bei Graphics2D auch einen Skalierungsfaktor angeben, dann muss man aber immer noch wissen welcher. Das wäre oben dann eben entweder newHeightHeightRatio oder newWidthWidthRatio.

Wegen der praktikablen Zeit: Das hast du gut auf den Punkt gebracht, stimmt :slight_smile:

Moin zusammen, das klingt ja erstmal super danke! Ich hab mit mal Bilder geben lassen die sind nahezu identisch in der Größe, das macht es einfacher denk ich :wink: dann werd ich mich bei Gelegenheit mal dran machen