imagecreatefromjpeg
Jimmy
- php
0 Sven Rautenberg0 Jimmy0 Klawischnigg0 Jimmy0 Klawischnigg0 Jimmy0 at
0 Klawischnigg0 at
0 Sven Rautenberg
Hallo,
Musste gerade feststellen dass die funktion nur bilder bis zu einer bestimmten größe bearbeitet.
die frage ist jedoch immernoch warum und bis wieviel pixel
erst dachte ich, ich bekomm die allowed_memory_size fehlermeldung da das bild zu groß ist, also vom speicherplatz her.
mein test bild hatte 800 KB und am ende nur noch 100 KB (Photo shop) und ich bekam den fehler immernoch. nun hab ich das bild mal um 50% verkleinert aber die dateigröße von 800 KB beibehalten und es ging!
Wieso?
Wie groß darf mein Bild sein (Height x Width)
Danke
Moin!
erst dachte ich, ich bekomm die allowed_memory_size fehlermeldung da das bild zu groß ist, also vom speicherplatz her.
mein test bild hatte 800 KB und am ende nur noch 100 KB (Photo shop) und ich bekam den fehler immernoch. nun hab ich das bild mal um 50% verkleinert aber die dateigröße von 800 KB beibehalten und es ging!
Die gdlib hält das Bild unkomprimiert im Speicher. Also gilt: Speicherplatz = width * height * 3 byte.
Eine 2-Megapixel-Kamera hat grob 2 Millionen Pixel - die in 24 Bit Farbauflösung bescheren dir 6 Megabyte Speicherbenutzung.
Wie groß darf mein Bild sein (Height x Width)
Es muß kleiner sein als der maximal erlaubte Speicherplatz für PHP-Skriptausführung. Dieser Wert kann differieren je nach Server.
Es muß kleiner sein als der maximal erlaubte Speicherplatz für PHP-Skriptausführung. Dieser Wert kann differieren je nach Server.
!Stop stop stop!
Bild a: 1632 * 1232 | 800 KB
Bild b: 1000 * 755 | 800 KB!!
Bild a geht nicht, Bild b schon.
hab ich was verpasst?
Danke Jimmy
hi there,
Bild a: 1632 * 1232 | 800 KB
Bild b: 1000 * 755 | 800 KB!!Bild a geht nicht, Bild b schon.
Bild a ist ja auch dreimal größer als Bild b, auch wenns auf der Platte gleich groß aussieht...
hi there,
Bild a: 1632 * 1232 | 800 KB
Bild b: 1000 * 755 | 800 KB!!Bild a geht nicht, Bild b schon.
Sind Bildgröße (Width*Height) und Bildgröße (KB) nicht zwei paar schuh?
Das Script sollte sich doch nur für die KB interessieren oder nicht?
Jimmy
Hi there,
Das Script sollte sich doch nur für die KB interessieren oder nicht?
Für das Script, das uploadet (oder was auch immer passiert) schon, für die GD-Lib nicht, die "macht" jedes Bild "auf", ehe sie es bearbeiten kann. Ist im Prinzip eine reine bit für bit - Herumschieberei, was immer damit auch passiert, und dafür aber braucht die GD-Lib mindestens den Speicher bildlänge x bildhöhe x farbtiefe (wobei ältere gd-libs ohnehin nur 256 Farben verarbeiten konnten, aber das sind ja auch schon wieder 2 byte). Dazu kommt noch Speicherbedarf für die Operationen. Wie Sven Rautenberg geschrieben hat, da kannst Du je nach zur Verfügung gestelltem Speicher bzw. je nach PHP zur Verfügung gestelltem Speicher schon bald einmal in die Bredoulle kommen...
Hi,
Speicher = bildlänge x bildhöhe x farbtiefe
1632*1232*3=6031872
Meine Memory Size geht aber bis 8388608
8388608
2356736 müsste ich also noch übrig haben oder wo frisst das script noch speicher? die paar variablen können doch nicht soviel fressen
wie errechne ich den jetzt die grenzen?
muss ich also nicht nur auf KB Größe achten sondern auch auf HEIGHT*WIDTH Größe?
Wie lege ich die werte fest?
gar nicht so easy...
Hallo Jimmy,
Speicher = bildlänge x bildhöhe x farbtiefe
1632*1232*3=6031872
Meine Memory Size geht aber bis 8388608
Wie schon beschrieben wurde, braucht die GD-Library auch noch nicht unerheblichen Speicher.
Da ist die Grenze ziemlich schnell erreicht.
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Wie schon beschrieben wurde, braucht die GD-Library auch noch nicht unerheblichen Speicher.
Wieviel genau??
bytes = Height*width*farbtiefe+anderebytes
wie finde ich die werte überhaupt alle raus??
jimmy
Hi,
Also hab jetzt mal ein paar JPEGs erstellt und musste die nächste kuriosität feststellen:
Breite Höhe Tiefe Bytes
a 1497 556 3 2.496.996
b 1000 834 3 2.502.000
c 1000 833 3 2.499.000
a geht nicht
b geht nicht
c geht! (aber komischer weise auch nicht IMMER) manchmal brauch es ein paar reloads.
habe die JPEGs mit:
<?php
$pic=ImageCreate($x,$y);
$col1=ImageColorAllocate($pic,200,200,200);
$col2=ImageColorAllocate($pic,0,0,255);
ImageFilledRectangle($pic,1,1,100,100,$col2);
ImageJPEG($pic,"pic.jpg");
ImageDestroy($pic);
?>
erstellt. ist die farbtiefe immer 3?
wie finde ich denn jetzt am besten den maximal wert?????
Danke
Jimmy
Hallo.
wie finde ich denn jetzt am besten den maximal wert?????
Der Maximalwert für "?" liegt bei 1.
MfG, at
Der Maximalwert für "?" liegt bei 1.
*grrr*
Breite Höhe Tiefe Bytes
a 1497 556 3 2.496.996
b 1000 834 3 2.502.000
c 1000 833 3 2.499.000
a geht nicht
b geht nicht
c geht!
wie finde ich denn jetzt am besten den maximal wert eines möglichen bildes in bytes?
wer den verlauf des threads sich anguckt versteht auch die frage!
Danke
Jimmy
Hallo.
wie finde ich denn jetzt am besten den maximal wert eines möglichen bildes in bytes?
Du siehst doch selbst, dass es keinen Maximalwert gibt, sondern eine mit der Größe sinkende Wahrscheinlichkeit. Sollte dir die Bildgröße bei einer als verlässlich einzustufenden Größe noch zu klein sein, solltest du dafür Sorge tragen, dass der zur Verfügung stehende Speicher deinen Anforderungen angepasst wird.
wer den verlauf des threads sich anguckt versteht auch die frage!
Der sieht aber vor allem, dass du die zahlreichen Antworten nicht verstehst, sondern immer wieder das gleiche noch einmal fragst. Deine multiplen Fragezeichen waren also gewissermaßen symptomatisch.
MfG, at
okay das muss die hitze sein.
es muss doch eine erklärung dafür geben warum bild a mit weniger speicherbedarf gegenüber bild c nicht geht und ein allowed_memory_size fehler kommt.
Ich hab aber eine Idee, wenn der User ein Neues Bild Uploadet führe ich das Script einfach schonmal aus Testhalber und wenn es fehlschlägt folgt eine Fehlerseite: Zu Großes Bild.
Das sollte auch gehen.
Aber ich kann dem User keine Werte geben Wie Maximal 1000 Height und Maximal 1000 Width. das ist das problem.
Jimmy
Hallo.
es muss doch eine erklärung dafür geben warum bild a mit weniger speicherbedarf gegenüber bild c nicht geht und ein allowed_memory_size fehler kommt.
Es ist eben nicht nur das Bild, das Speicher belegt.
Aber ich kann dem User keine Werte geben Wie Maximal 1000 Height und Maximal 1000 Width. das ist das problem.
Doch. Begrenze die Größe innerhalb deines Skriptes auf einen Wert, der bei dir sicher funktioniert und gib diesen Wert als Maximalwert an.
MfG, at
Hallo,
Doch. Begrenze die Größe innerhalb deines Skriptes auf einen Wert, der bei dir sicher funktioniert und gib diesen Wert als Maximalwert an.
Ich hab doch gar kein Anhaltspunkt.
Zunächst dachte ich es kommt auf die KB des Original bildes an
dann dachte ich es kommt auf den Maximalen Speicherbedarf an( height*width*3 = maximal speicherbedarf)
und nun soll ich einfach nur noch rumprobieren mit height*width?
also ich bin sehr verwirrt, wsa die logik bei dem ganzen betrifft.
Jimmy
Hallo.
und nun soll ich einfach nur noch rumprobieren mit height*width?
Nein, du sollst dir ein Skript für eine Testreihe schreiben, um hinreichend sichere Werte zu erhalten. Von denen kannst du dann noch eine gewisse Reserve abziehen. Die Farbtiefe spielt in diesem Zusammenhang zunächst einmal keine Rolle, wenn du einfach von den üblichen 24 Bit ausgehst.
also ich bin sehr verwirrt, wsa die logik bei dem ganzen betrifft.
Ja, das merkt man.
MfG, at
+++ hilfe hilfe hilfe hilfe hilfe hilfe hilfe hilfe hilfe +++
Ich dreh noch durch.
Je mehr ich teste, desto kurioser wird es, und ohne logische erklärung tappe ich nur noch im dunklen rum.
So kam es eben zu folgendem Ergebniss
1000*833 geht aber
833*1000 geht nicht
was macht das denn für einen sinn?
beide bracuhen doch GLECIH viel Speicher...
..Ich kann nicht mehr..
Jimmy
hi,
So kam es eben zu folgendem Ergebniss
1000*833 geht aber
833*1000 geht nichtwas macht das denn für einen sinn?
beide bracuhen doch GLECIH viel Speicher...
würdest du jetzt bitte endlich zur kenntnis nehmen, dass bildhöhe mal breite mal drei nicht das einzige ist, was an speicher verbraucht wird?
du hast verschiedene variablen mit verschiedenen inhalten in deinem script (obwohl die vermutlich nur einen geringen teil ausmachen dürften);
das bild muss entpackt werden, dabei wird ein komplizierter algorithmus ausgeführt, der ebenfalls speicher braucht, und da u.a. davon abhängig wie stark das originalbild gepackt ist;
wenn du das GD-objekt wieder als gepacktes bild ausgeben willst, läuft ein algorithmus, der auch wieder speicher verbraucht;
etc. pp.
nimmst du das jetzt bitte endlich zur kenntnis, und dass deine versuche nicht geeignet sind, sein _können_, bis auf den letzten pixel eine "maximal mögliche" bildgröße zu bestimmen?
at und Klawischnigg sagten dir nicht umsonst, dass du eine absolut genaue bestimmung vergessen kannst, sondern hier mit einer ausreichend niedrig angesetzten obergrenze arbeiten sollst.
also probiere bspw. ein paar verschiedene 800*600-bilder aus - und wenn es mit denen ausnahmslos klappt, hast du gute chancen, diese größe als "verträglich" bezeichnen zu können.
gruß,
wahsaga
okay okay, Alles zur kenntniss genommen!
Aber ich möchte doch erstmal versuchen das Maximale Maximum rauszuholen um dann sicher werte abzustreichen zb. 100 pixel
oder wie viel sind gut?
Jimmy
Moin!
Aber ich möchte doch erstmal versuchen das Maximale Maximum rauszuholen um dann sicher werte abzustreichen zb. 100 pixel
Deine Meßreihen zeigen, dass offenbar die Grenze bei ungefähr 2,5 MB liegt, bzw. 830.000 Pixeln.
Da gerade an den Grenzbereichen teilweise unlogisch erscheinende Unschärfen existieren, wäre es sicherlich gut, die vorzunehmende Sicherheitsgrenze mit 5% anzusetzen, d.h. 790.000 Pixel bzw. 2.370.000 Byte entpackte Bildgröße. Mit getimagesize() kannst du die Einhaltung dieser Grenze vor der Verarbeitung ja prüfen, da getimagesize() das Bild dazu nicht in den Speicher lädt, sondern nur im Bildheader dessen Größenangaben ausliest.
Ich möchte meine Rechnungsgrundlage "breite*höhe*3 Byte" auch nur als Faustregel verstanden wissen. Was noch an zusätzlichen Verwaltungsinformationen gespeichert werden muß, habe ich nicht untersucht. So tief wollte ich dann doch nicht in den Code einsteigen. Diese Faustregel erklärt nur auf simple Weise, warum ein 100KB-JPEG trotzdem noch zu groß sein kann.
meine testreihe:
höhe breite bytes test
y x
5000 150 3 2.250.000 ok
5000 165 3 2.475.000 nicht ok
5000 160 3 2.400.000 ok
160 5000 3 2.400.000 ok
165 5000 3 2.475.000 ok
167 5000 3 2.505.000 ok
168 5000 3 2.520.000 nicht ok
900 900 3 2.430.000 ok
912 913 3 2.497.968 nicht ok
913 912 3 2.497.968 ok
914 912 3 2.500.704 nicht ok
Ich möchte den User nicht auf 800*600 beschränken.
Viel Lieber würde ich gerne dem User erklären wo die waren grenzen sind. aber wie erkläre ich einem user bytes und das er entweder ein bild mit 912*912 hochladen kann oder auch 5000*150.
Jimmy
Hi there,
Ich hab doch gar kein Anhaltspunkt.
Doch, den gibt es, auf Pixel genau.
und nun soll ich einfach nur noch rumprobieren mit height*width?
Du kannst herumprobieren, besser aber wäre es, Du ermittelst mit getimagesize() einfach die Dimensionen des Bildes und entscheidest einfach danach, ob das Bild bearbeitet werden darf oder nicht. Wenn Dir offenbar das RAM ausgeht, weil der Server auf dem Du das Skript laufen lässt den Spreicher entsprechend restriziert und Du das nicht ändern kannst, dann darfst Du halt bspw. keine Bilder zur Verarbeitung zulassen, die grösser als 800x600 groß sind, damit wärst Du dann vermutlich auf der totsicheren Seite...
also ich bin sehr verwirrt, wsa die logik bei dem ganzen betrifft.
hmm ???
Hallo.
(wobei ältere gd-libs ohnehin nur 256 Farben verarbeiten konnten, aber das sind ja auch schon wieder 2 byte)
Dann fallen deine Bytes heute aber sehr klein aus.
MfG, at
Hi there,
(wobei ältere gd-libs ohnehin nur 256 Farben verarbeiten konnten, aber das sind ja auch schon wieder 2 byte)
Dann fallen deine Bytes heute aber sehr klein aus.
ja, schon als ich abgedrückt habe, war mir klar, daß ich mich vertan hatte, aber wie zurückholen ...
Hallo.
ja, schon als ich abgedrückt habe, war mir klar, daß ich mich vertan hatte, aber wie zurückholen ...
Tja, das geht leiser tatsächlich nicht. Aber es war ja wirklich nur ein Detail.
MfG, at
Moin!
Es muß kleiner sein als der maximal erlaubte Speicherplatz für PHP-Skriptausführung. Dieser Wert kann differieren je nach Server.
!Stop stop stop!
Bild a: 1632 * 1232 | 800 KB
Bild b: 1000 * 755 | 800 KB!!
Deine Dateigrößen interessieren nicht. Die beziehen sich auf die komprimierte Version des Bildes auf der Festplatte. Die gdlib kann aber nicht im JPEG-Modus im Bild herumzeichnen, also wird es beim Laden entpackt.
Bild a ist _ungepackt_ im Speicher 1632*1232*3 Byte groß - das sind 5,7 GiB oder 6 Millionen Byte.
Bild b ist nur 1000 * 755 * 3 Byte groß: 2,1 GiB oder 2,2 Millionen Byte.
Wenn du das Bild als BMP-Format abspeicherst (24 Bit), dann ist die resultierende Dateigröße minus ein paar Bytes die Größe, die der RAM-Speicher für die gdlib auch aufweisen muß.