Png in jpg per PHP Wandeln

Guten Tag,

ich stehe leider auf dem Schlauch und weiß nicht so recht weiter.

Der Shop kommt ja mit png Bildern nicht richtig klar.
Ich hole mir Artikelbilder der Hersteller direkt per PHP Script ich habe aber jetzt das Problem das eineige Bilder neuerdings auch png sind. Gebeben sind Bild URL der Artikelbilder.

Ich müsste also Prüfen ob das Bild ein png ist wenn ja dann in jpg Wandeln und local auf dem recher speichern.

[QUOTE=Rene;29147]Der Shop kommt ja mit png Bildern nicht richtig klar.[/QUOTE]
Ist das so?

Warum eigentlich???

sieh selbst

http://www.blue-music.de/mischpulte/behringer-xenyx-x1222usb.html

gute Frage.

[QUOTE=Rene;29164]sieh selbst

http://www.blue-music.de/mischpulte/behringer-xenyx-x1222usb.html

gute Frage.[/QUOTE]
Und was ist das Problem?

Die grössen werden nicht angepasst und die Bilder sehen zerfressen aus.
Sieht man doch?

Hast du die Bilder über den Admin hochgeladen?

nein,

über die Amicron schnittstelle vom Volker

Dann liegt’s wohl an der Schnittstelle.

bin jetzt soweit das die Bilder gewandelt werden aber der der Hintergrund ist jetzt schwarz statt weiß

hier ein ausschnitt der wandlung.

$img   = imagecreatefrompng($name);

    $width = imagesx($img);
    $height = imagesy($img);
    $tmp_img = imagecreatetruecolor($width ,$height);
    imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $width, $height, $width, $height );

    ob_start();
    imagejpeg($tmp_img);
    //imageDestroy($tmp_img );
    $i = ob_get_contents();
    $fp = fopen( '/' .$title.".jpg", "w" );
    fwrite ($fp, $i);
    fclose ($fp);

Wenn du das Bild nur umwandeln willst, brauchst du kein temporäres Bild, und außerdem kannst du mit imagejpeg das Bild auch gleich schreiben ohne es auszugeben. Dann sollten die transparenten Bereiche auch weiß werden:


<?
$img   = imagecreatefrompng('test.png');
imagejpeg($img,"test.jpg",90);
?>

OK klappt jetzt ist der Hintergrund weiß.

aber…

der Übergang von Bild zu Hintergrund ist jetzt extrem “treppig” geworden. Gerade Kanten die schräg verlaufen sehen jetzt aus wie Treppenstufen (etwas Übertrieben).

imagejpeg($img,null,100);

100 als Qualität macht die Bilder unnötig groß, die Kanten werden dadurch nicht schöner. Was hast du denn als Ursprungsbilder genommen? Wenn du die Bilder aus dem Shop genommen hast, die sind ja schon treppig, da hilft die nachträgliche Umwandlung in jpg nicht mehr.

Du müsstest ausgehend z.B. von den Zoombildern die Bilder für die Detailseite und die Thumbnails neu erstellen (mit imagecopyresampled nicht imagecopyresized).

Am einfachsten wäre es doch die Schnittstelle anzupassen so dass auch pngs funktionieren.

Die Ursprungsbilder sind völlig OK alle haben eine Grösse von ca. 800x600 das sollte reichen denn grösser will ich Sie auch nicht haben.

Wie sieht dein aktueller Code inkl. Größenänderung aus?

so: (mit dem Werten für imagejpeg() habe ich probiert aber das Ergebniss ist fast immer das gleiche.)

 $img   = imagecreatefrompng($name);
   ob_start();
   imagejpeg($img,null,100);
   $i = ob_get_contents();
   $fp = fopen( '/' .$title.".jpg", "w" );
   fwrite ($fp, $i);
   fclose ($fp);
   imagedestroy($img) ;

Gibt es Optionen in PHP die die Ausgabe verbessern?
Ich würde gern bei PHP bleiben alternativ habe ich mich dann mit externen Programmen beschäftigt. Mein Referenzbild war das hier.

http://www.behringer.de/EN/images/lightboxphotos/X1222USB_P0A0I_Right_XL.png

Dann habe ich das mit Infran view Probiert das ergebniss ist auch nicht berrauschend ähnlich der php Variante.

Ich sehe was du meinst. Warum machst du das eigentlich immer noch mit ob und fwrite, imagejpeg kann doch direkt ins Dateisystem schreiben?

Die Zacken kannst du vermeiden wenn du doch wie in deinem ursprünglichen Code das Bild in ein zweites kopierst. Anscheinend wird sonst die Transparenz nicht richtig umgesetzt. Den Hintergrund bekommst du weiß indem du ein weißes Zielbild verwendest:


<?
header('Content-type: image/jpeg');
$url = 'http://www.behringer.de/EN/images/lightboxphotos/X1222USB_P0A0I_Right_XL.png';

$img   = imagecreatefrompng($url);

$width = imagesx($img);
$height = imagesy($img);
$tmp_img = imagecreatetruecolor($width ,$height);
$imgWhite = imagecolorallocate( $tmp_img, 255, 255, 255 );
imagefill( $tmp_img, 0, 0, $imgWhite );

imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $width, $height, $width, $height );
imagejpeg($tmp_img,null,90);
?>

Perfekt!

Funktioniert Dank Dir.
Auf die Idee muß man erst mal kommen in ein weißes Bild zu schreiben.
Eigentlich könnte man ja so auch sein Wasserzeichen einbauen wenn man wollte.

Mfg
René