PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : imagecopyresized --> farben kaputt


Willow
09.11.2005, 14:36:58
ich möchte ine bild (jpg) , das der user per upload an den server geschickt hat auf eine bestimmte grösse verkleinern ...

dazu habe ich ....

mit $info=getimagesize($bildfile)
die bilddaten des originals abgerufen, um das verhältnis höhe:breite zu ermitteln und mit ...


$image = imagecreatefromjpeg($bildfile);
$imageneu = imagecreate($breite,$hoehe);
imagecopyresized($imageneu, $image, 0,0, 0,0,$breite,$hoehe, $info[0],$info[1]);
imagejpeg($imageneu, "img/bildneu.jpg");


die dann umgerechnete bilddatei in "bildneu.jpg" geschrieben.

was ich erhalte schaut aus wie ein gespensterbild - etwa so wie bilder (früher) ausgesehen haben, wenn in der dunkelkammer während das fotopapier in der entwicklerchemie war, jemand die tür aufgerissen hat ...
(nennt man das solarisation ...?)
bild ist zwar da (die figuren erkennbar), aber farben weg ..

wers sehen will: original: usk.at/original.jpg
kopie; usk.at/resized.jpg

kann mir jemand sagen, woran das liegt?

apropos - noch eine frage:

bei "$image = imagecreatefromjpeg($bildfile);" scheint es eine sperre bezüglich der dateigrösse zu geben - wenn das original eine bestimmte grösse überschreitet, erhalte ich die fehlermeldung:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 8548 bytes) in /home/www/web17/html/betriebe/809.php on line 52

wie "umgeht" man das bzw. wie stellt man diese obergrenze ein? (in "SELFPHP" finde ich - unter "imagecreatefromjpeg" - darüber nichts.

nites
09.11.2005, 15:00:09
Man nennt es Solarisation, aber das ist es nicht.
Ich hatte das auch mal versucht (Bin an chmod gescheitert), aber hier mal mein Code, der local funktioniert hat:
// Original kopieren //
$dateiname = "portrait_".$vorname."_sw.jpg";
copy($_FILES['file']['tmp_name'], "../fotos/ensemble/".$dateiname);
// Original kopieren - Ende//

// originalgroßes neues 1. Bild erstellen //
$original_image = imagecreatefromjpeg("../fotos/ensemble/".$dateiname);
// originalgroßes neues 1. Bild erstellen - Ende//

$breite = imagesx ($original_image);
$hoehe = imagesy ($original_image);

// 48x64 neues 2. Bild erstellen //
$image_small = imagecreatetruecolor (48,64) or die("Cannot Initialize new GD image stream");
// 48x64 neues 2. Bild erstellen - Ende//

// originalgroßes neues 1. Bild in 48x64 neues 2. Bild kopieren //
imagecopyresized($image_small, $original_image, 0,0, 0,0,48,64,$breite,$hoehe);
// originalgroßes neues 1. Bild in 48x64 neues 2. Bild kopieren - Ende//

// 2. Bild in Ordner erstellen //
imagejpeg($image_small, "../fotos/ensemble/".$dateiname);
// 2. Bild in Ordner erstellen - Ende//

Vielleicht liegt es auch nur an imagecreatetruecolor.
Hoffe es hilft.

nites

meikel (†)
09.11.2005, 15:29:58
Die beiden FAQ Texte beachten:
22.4. Warum werden beim Bearbeiten von Bildern mit den Image-Funktionen die Farben verfälscht?
http://www.php-faq.de/q/q-grafik-farben.html

22.3. Wie kann ich Bilder verkleinern?
http://www.php-faq.de/q/q-grafik-verkleinern.html

... dann klappts auch mit den Farben...

StefanL
09.11.2005, 15:32:32
Vorausgesetzt du hast GD 2.0 oder höher solltest du imagecreatetruecolor anstelle von imagecreate benutzen.

EDIT:

da waren andere schneller beim Schreiben... sorry

Willow
09.11.2005, 15:34:01
bingo --> DANKE!

ich hab nur imagecreate durch imagecreatetruecolor ausgetausch --> es funkt!


weiss noch jemand wegen der dateigrössenprobleme abhilfe?

meikel (†)
09.11.2005, 15:43:18
weiss noch jemand wegen der dateigrössenprobleme abhilfe?
Na klar:
22.3. Wie kann ich Bilder verkleinern?
http://www.php-faq.de/q/q-grafik-verkleinern.html

Dringender Hinweis, falls Du JPG Bilder bearbeiten willst:
PHP konvertiert VOR der Bearbeitung das Bild in ein internes Pixelformat und verbrät auf diese Art und Weise ganz viel Scriptspeicher.

Beispiel: ein 800KB kleines JPG benötigt zum "Schrumpfen" bei PHP4 ca. 12 MB und bei PHP 5.0.4 ca. 24 MB Scriptspeicher. Sonst funktioniert es nicht. Je nach Config werden Fehler angezeigt.