[GD] Wiedermal: Transparenz bei PNGs

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [GD] Wiedermal: Transparenz bei PNGs

    Ich weiss, dass es das Thema bereits gab, doch trotz googeln, PHP Manual und den Threads hier konnte ich bislang keine Lösung für mein Problem finden.
    Dabei geht es wie bereits gesagt um die Transparenz bei PNGs.
    Ich habe es bereits mit imagecolortransparent() und unzähligen Möglichkeiten die transparente Hintergrundfarbe zu bestimmen und zu dem imagecolortransparent() zu übergeben (imageallocate(), imagecolorexact(), imagecolorat()) versucht, bis ich dann hier etwas von einem imagealphablending() las...welches ich auch probiert habe...noch in Kombination mit imagecreatetruecolor() statt imagecreate() und einem imagecolorallocatealpha()...was aber auch keinen Erfolg brachte. Insgesamt eben unzählige verschiedene Kombinationen, die allesamt nicht halfen, deswegen habe ich mich dazu entschlossen hier ein Thema aufzumachen.
    Anzumerken wäre vllt. noch, das es einmal geklappt hat, das Image transparent zu machen, undzwar mit imagecolorat() auf ein bestimmtes Pixel, was die später transparente Farbe enthält (reines rot) und anschliessendem imagecolortransparent()...nur ist das keinesfalls eine saubere Lösung und über imageallocate() bzw. den RGB Code dieses reinen Rotes (255,0,0) komme ich nicht auf die Lösung, was mich an sich verwundert, da das imagecolorat() und ein reines definieren der Farbe mit 255,0,0 ja das selbe Ergebnis liefern sollte. Jedoch habe ich auch schon in einem Grafikprogramm die Farbe in dem Pixel betrachtet und kam so auch auf eine Zusammensetzung der Farbtöne von 255,0,0.
    Ich weiss einfach nichtmehr was ich noch probieren soll.

    Ansich soll das Programm folgendes machen (vereinfacht):

    Image 1 ist ein neues Image was erstellt werden soll.
    Image 2 ist ein bereits bestehendes mit dem besagten Rot, das am Ende transparent sein soll.
    Nun soll Image 2 nach Image 1 kopiert werden und Image 1 mit der transparenten Hintergrundfarbe abgespeichert werden.

    Hier noch mein (aktueller) Stand/Code:

    PHP-Code:
    <?php

    $file 
    "image.png";
    $dir "test/bla"//zum hinspeichern

    header("Content-type: image/png");

    $src_img imagecreatefrompng($file);
    $img imagecreatetruecolor(200,200);

    $red imagecolorallocatealpha($img25500127);

    ImageAlphaBlending($imgtrue);

    imagecopy($img$src_img0000200200);

    imagepng($img$dir."/test.png");

    imagedestroy($img);

    ?>

  • #2
    Willst du das nur transparent speichern ?

    Willst du das Bild nur transparenz wandeln und dann speichern für die eigene Verwendung oder soll es nacher noch in einem Browser transparent dargestellt werden ?!?

    <?
    $file = "pic.png";
    $dir = ".";
    header("Content-type: image/png");
    $src_img = imagecreatefrompng($file);
    $img = imagecreatetruecolor(200,200);
    $red = imagecolorallocatealpha($img, 0, 0, 0, 127);
    $white = ImageColorAllocate ($img, 255, 255, 255);
    ImageColorTransparent($img, $white);
    //ImageAlphaBlending($img, true);
    imagecopy($img, $src_img, 0, 0, 0, 0, 200, 200);
    imagepng($img, $dir."/test.png");
    imagedestroy($img);
    ?>

    Wenn ich das ganze so mache, ist das Bild transparent. Zumindest wird es im Firefox und mit Paint Shop 8 so interpretiert. Der IE 6.0 natürlich macht es mal wieder nicht ;o). Daher bin ich auch mehr Fan von .gif, wenn es für den IE ist. Sonst halt nur noch mit Firefox arbeiten, denn der erkennt das transparente Ergebnis (test.png) ja.
    Zuletzt geändert von djayk; 11.03.2005, 22:46.

    Kommentar


    • #3
      Also, für meine Zwecke wär es wichtig, dass das Bild transparent _abgespeichert_ wird und später auch in allen Browsern transparent dargestellt wird.
      Ich persönlich benutze den Firefox, aber ich will es "massentauglich" haben und da der IE auch von vielen Usern benutzt wird brauch ich eine Möglichkeit das Bild transparent zu speichern, sodass es später auch von jedem der es aufruft so transparent dargestellt wird.
      Normal würde ich bei so etwas auch GIF preferieren, doch da streikt meine GD Version leider...kein GIF Support...

      gd_info liefert folgendes:
      array(11) { ["GD Version"]=> string(27) "bundled (2.0.15 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["T1Lib Support"]=> bool(false) ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(false) ["JPG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XBM Support"]=> bool(true) ["JIS-mapped Japanese Font Support"]=> bool(false) }
      Soweit ich mich erinnern kann wurde der GIF Support aus irgendwelchen Gründen in neueren GD Versionen abgeschafft. Aber falls es keine andere Möglichkeit gibt, werde ich wohl auf eine GIF supportende (ggf. ältere) GD Version patchen müssen.

      Wäre GIF die einzige brauchbare Lösung?

      Kommentar


      • #4
        Also, ich habe inzwischen dein Beispiel ausprobiert (vielen Dank nochmal) und den Hexcode für die transparente Farbe von Weiss auf Rot umgeschrieben...und tatsächlich geht es...zumindestens mit meinem Firefox. Nur wie du bereits sagtest streikt der IE da...aber ich brauche eine Crossbrowser Variante...hatt da jemand eine Idee wie es noch realisierbar wär? Oder ist ein umpatchen auf eine GIF kompatible GD Version dann am Ende doch die einzige Lösung?

        Kommentar


        • #5
          also ich kombiniere transparente pngs mit jpegs und gebe das ganze als transparentes png aus => http://www.megasprueche.de ... in meinem ie klappt es

          codetechnisch sieht das in etwa so aus:
          PHP-Code:
          <?
          $file = "pic.png";
          $dir = "."; 
          header("Content-type: image/png");
          $src_img = imagecreatefrompng($file);
          $img = imagecreate(200,200);
          //$img = imagecreatetruecolor(200,200);
          //$red = imagecolorallocatealpha($img, 0, 0, 0, 127);
          $white = ImageColorAllocate ($img, 255, 255, 255);
          ImageColorTransparent($img, $white);
          //ImageAlphaBlending($img, true);
          imagecopy($img, $src_img, 0, 0, 0, 0, 200, 200);
          imagepng($img, $dir."/test.png");
          imagedestroy($src_img);
          imagedestroy($img);
          ?>
          wenn ich mich recht entsinne, warén es 8-bit pngs, keine 24-bit.
          Kissolino.com

          Kommentar


          • #6
            Also soweit ich das sehe wäre die einzige Veränderung das imagecreatetruecolor() durch ein imagecreate() zu ersetzen und das 2te imagedestroy() am Ende.
            Wenn ich es so probiere funktioniert es leider gar nicht. Weder im Firefox, noch im IE.
            Mein Ausgangs-PNG ist übrigens auch ein 8-Bits-PNG.

            Ich habe mir jetzt überlegt doch meine GD Version zu wechseln. Soweit ich auf http://www.boutell.com/gd/ gelesen habe ist der GIF Support seit 2.0.28 wieder mit dabei. Ich habe mir jetzt die GD Lib Version 2.0.33 gedownloadet und entpackt, nur weiss ich nicht, was ich damit machen soll...

            Als ich meine alte GD Lib installiert hatte, hatte ich hier gelesen, dass man das ; vor "extension=php_gd2.dll" in der php.ini entfernen muss, um die GD Ver zum laufen zu bringen. Soweit ging es ja auch. Aber jetzt habe ich ja eine neue Version und will meine alte aktualisieren. Aber wie? Mit den ganzen *.c Datein etc. im entpackten Ordner kann ich wenig anfangen und das einzige was ich mir vorstellen könnte, wär dass ich die "php_gd2.dll" im Extensions-Verzeichnis updaten muss, aber so eine Datei liegt meiner GD Version nicht bei.
            In der Installationsanleitung oder über eine Google Suche komme ich immer nur zu einer Liste von Perl Commands o.ä. die man benutzen soll, die mir andererseits aber auch nicht weiterhelfen...
            Zuletzt geändert von KTJ; 23.03.2005, 22:25.

            Kommentar


            • #7
              Kann mir da denn keiner weiterhelfen?

              Also ich habe z.Z. PHP Version 4.3.3 und GD 2.0.15. Meine GD Lib möchte ich updaten auf Version 2.0.33. Ich habe die Version auch gedownloadet und entpackt...nur weiss ich jetzt nicht, was ich damit anfangen soll bzw. wie ich sie installieren kann.

              Kommentar

              Lädt...
              X