Mehrere Bilder manuell (ohne GD) zu einem zusammenfassen
AllesMeins
- php
0 Sönke Tesch0 AllesMeins0 Sven Rautenberg0 Marc
Hallo,
kennt jemand von euch ein Script, das mehrere JPEGs zu einem grossen Bild zusammenfassen kann ohne dabei die GD zu benötigen? Das müsste doch in der Theorie gehen, da die Bildinformationen ja da sind. Diese Infos müssten dann nur irgendwie mit den header eines grösseren bildes zusammengepackt werden. kennt jemand solch ein Script?
Grüsse
Marc
kennt jemand von euch ein Script, das mehrere JPEGs zu einem grossen Bild zusammenfassen kann ohne dabei die GD zu benötigen? Das müsste doch in der Theorie gehen, da die Bildinformationen ja da sind.
Das kannst Du versuchen, wirst aber sicher nicht viel Freude daran haben. PHP ist ein Interpretersystem und interpretierte Programme haben gegenüber in Maschinencode vorliegenden Programmen den unangenehmen Nachteil _extrem_ langsam zu sein.
Bei kodierten Bildinformationen, und gerade bei Formaten wie JPEG, liegen die Bildinformationen auf die eine oder andere Art blockweise vor (vielleicht hast Du schonmal die Klötzchenbildung bei MPEG oder JPEG gesehen). Das wiederum bedeutet, daß Du mit hoher Wahrscheinlichkeit nicht einfach die Daten auf Dateiebene zusammenpappen kannst, sondern das Bild komplett dekodieren und anschließend wieder enkodieren mußt - viel Arbeit.
Falls Du also nicht gerade sehr winzige Bilder verwursten willst, prophezeihe ich Dir eine Ausführungszeit im zweistelligen Minutenbereich.
Gruß,
soenk.e
Hiho,
die Bilder sind jeweils 20x20 px gross... Das ist also nicht das Problem... Mein problem ist das ich so gut wie nichts über das JPEG Format weiss, es also wohl kaum selber schreiben können werde
Marc
Moin!
die Bilder sind jeweils 20x20 px gross... Das ist also nicht das Problem... Mein problem ist das ich so gut wie nichts über das JPEG Format weiss, es also wohl kaum selber schreiben können werde
Das ist ja noch schlimmer! JPEG benutzt Blöcke von 8x8 Pixeln. Das bedeutet, dass man im Prinzip diese Blöcke möglicherweise ohne größere Probleme aneinanderpacken könnte, wenn das Bild ein Vielfaches von 8 Pixeln breit und hoch ist. 20x20 Pixel hingegen kann man nicht ohne weiteres zusammenkleben, weil am rechten und unteren Rand 4 Pixel sichtbar und 4 weitere unsichtbar sind. Würde also ein weiteres 20x20-Bild hinzukommen, würde ein halber Pixelblock in der Bildmitte entstehen, der da laut JPG-Format nicht sein darf.
Deshalb muß man in solchen Fällen JPEG erst komplett dekodieren und als Bitmap in den Speicher packen, die Bilder alle aneinanderfügen und dann wieder als ein Bild kodieren, damit es klappt. Die "Block-Zusammenkleben"-Lösung wäre eine reine Speziallösung für spezielle Bilder - von der ich aber nicht weiß, ob sie wirklich so funktionieren wird.
- Sven Rautenberg
Hiho,
wie sieht das aus, wenn ich als Ausgangsdateien andere Formate nähme? Also entweder pngs oder gifs oder bmps. Ginge das besser die zusammenzupappen? Bei bmps müsste das ganze dann aber trotzdem noch komprimiert werden, da ich ja keine riesigen bmps (von der grösse her) ausgeben will.
Grüsse
Marc
Moin!
wie sieht das aus, wenn ich als Ausgangsdateien andere Formate nähme? Also entweder pngs oder gifs oder bmps. Ginge das besser die zusammenzupappen?
BMPs: Ja. Die sind ja aber auch unkomprimiert. :) Ich kenne das Format nicht genau, aber im Prinzip sind bei 24-Bit-BMPs immer drei Byte für ein Pixel zuständig, und das wiederholt sich endlos. Der Bildheader sagt, welche Auflösung das Bild hat, und entsprechend werden die Pixel dann in Zeilen sortiert. Ein Zusammenpappen sollte also relativ leicht gehen, indem man wechselweise die Datenströme zweier Bilder in die Ausgabedatei fließen läßt - der Header muß dann natürlich noch angepaßt werden. Und selbst wenn die beiden Bilder keine identischen Formate haben, kann man durch einfügen von "Leere" (also z.B. Schwarz) das Ausgabeformat rechteckig machen.
PNGs und GIFs sind komprimierte Formate, die sich nicht so ohne weiteres kombinieren lassen, genau wie JPG.
Bei bmps müsste das ganze dann aber trotzdem noch komprimiert werden, da ich ja keine riesigen bmps (von der grösse her) ausgeben will.
Und genau das ist dann wieder das Problem. Programmierst du mal eben in PHP einen JPEG-Algorithmus? Wie schnell ist der? JPEG selbst ist eigentlich relativ leicht - Blöcke bilden, Diskrete Cosinus-Transformation der Blöcke, Gewichtung der Koeffizienten und schließlich RLE-Komprimierung. Alles keine Geheimwissenschaft - nur eben mit gdlib schneller und einfacher realisiert, als mit einer Eigenbau-Funktion in PHP.
- Sven Rautenberg
M.oin,
das Problem ist halt das die GD 1 keine anständigen farben unterstützt. Und GD 2 ist soweit ich weiss noch net überall Standart... Ausserdem müsste ich hier bei meinem testserver auch PHP neu kompilieren :D Deswegen würde ich es lieber ohne machen... Aber wenn das so viele probs macht werde iche s wohl mit der GD lösen...
Marc