png's verkleinern mit GD und Transparenz behalten?

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

  • png's verkleinern mit GD und Transparenz behalten?

    Wie verkleinert man PNGs mit GD und behält dabei deren Transparenz? Geht das überhaupt?
    So sieht's momentan aus
    PHP-Code:
    $src_img imagecreatefrompng($_FILES['datei']['tmp_name']);
    $dst_img imagecreatetruecolor($neu_w,$neu_h);
    imageCopyResampled($dst_img$src_img0000$neu_w$neu_h$alt_w$alt_h);
    imagepng($dst_img'dateiname'
    aber das geht mal überhaupt nicht, der setzt Transparenz = schwarz...

    dann hab ich's so probiert
    PHP-Code:
    $src_img imagecreatefrompng($_FILES['datei']['tmp_name']);
    $dst_img imagecreate($neu_w,$neu_h); # hier ist der Unterschied
    imageCopyResampled($dst_img$src_img0000$neu_w$neu_h$alt_w$alt_h);
    imagepng($dst_img'dateiname'
    mit dem Erfolg, dass die Transparenz blieb, aber alle anderen Farben ziemlich häßlich wurden >_>

    In der Manual hab ich dann noch die Funktionen gefunden
    PHP-Code:
    imageAlphaBlending($imgPngtrue);
    imageSaveAlpha($imgPngtrue); 
    Aber wo auch immer ich sie im obersten PHP-Code eingefügt habe, es blieb immer bei Transparenz = Schwarz...

    langsam gehen mir die Ideen aus, hat noch wer nen Vorschlag?

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

  • #2
    versuchs mal mit
    PHP-Code:
    $src_img imagecreatefrompng($_FILES['datei']['tmp_name']);
    $dst_img imagecreatetruecolor($neu_w,$neu_h);

    /* snip */
    $white imageColorAllocate ($dst_img255255255);
    $trans imagecolortransparent($dst_img,$white);
    /* snap */

    imageCopyResampled($dst_img$src_img0000$neu_w$neu_h$alt_w$alt_h);
    imagepng($dst_img'dateiname'
    Kissolino.com

    Kommentar


    • #3
      Original geschrieben von Wurzel
      versuchs mal mit
      PHP-Code:
      $src_img imagecreatefrompng($_FILES['datei']['tmp_name']);
      $dst_img imagecreatetruecolor($neu_w,$neu_h);

      /* snip */
      $white imageColorAllocate ($dst_img255255255);
      $trans imagecolortransparent($dst_img,$white);
      /* snap */

      imageCopyResampled($dst_img$src_img0000
         
      $neu_w$neu_h$alt_w$alt_h);
      imagepng($dst_img'dateiname'
      hm...nicht wirklich, kommt auch nur ein schwarzer Hintergrund...mit 0, 0, 0 statt 255, 255, 255, funktioniert es (besser), aber nicht perfekt: Er killt die Outlines mit -.-
      http://www.mangacarta.de/data/userpics/2.png
      und so sollte es aussehen
      http://www.mangacarta.de/data/userpics/2.big.png

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        1. (blöde) frage: warum kopierst du das png nicht erst auf der hintergrund und skalierst dann => imagecopy() ?

        2. frage: warum klappt imagecreate() nicht? 24bit png?

        3. frage: mal ne farbe genommen, die NICHT im png enthalten ist?
        Kissolino.com

        Kommentar


        • #5
          Original geschrieben von Wurzel
          1. (blöde) frage: warum kopierst du das png nicht erst auf der hintergrund und skalierst dann => imagecopy() ?
          hm was meinst du? $dst_img ist ein leeres Bild:
          PHP-Code:
          $dst_img imagecreatetruecolor($neu_w,$neu_h); 
          worauf das nur resized geschrieben wird...
          Die reine Kopie kann ich doch dann nicht mehr in der Größe verändern, oder? Hab zumindest nix dazu gefunden...


          2. frage: warum klappt imagecreate() nicht? 24bit png?
          laut IrfanView sogar 32Bit ^^...


          3. frage: mal ne farbe genommen, die NICHT im png enthalten ist?
          das soll sich nicht nur auf ein PNG anwenden lassen, sondern generell Thumbs erstellen von allen PNGs, ich denke nicht, dass ich das Glück habe eine Farbe zu finden, die in keinem png der Welt vorhanden ist T_T

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Original geschrieben von ghostgambler
            Die reine Kopie kann ich doch dann nicht mehr in der Größe verändern, oder? Hab zumindest nix dazu gefunden...
            rembrandt? du kannst die img-resourcen hin-und-her-kopieren/-resizen/-farbverändern etc. pp wie du lustig bist.
            laut IrfanView sogar 32Bit ^^...
            sche*** idee. die gd arbeitet intern afaik nur mit 8bit bei png => www.boutell.com
            das soll sich nicht nur auf ein PNG anwenden lassen, sondern generell Thumbs erstellen von allen PNGs, ich denke nicht, dass ich das Glück habe eine Farbe zu finden, die in keinem png der Welt vorhanden ist T_T
            1. kannst du mit gd-funktionen - zumindest bei paletten-bildern - die verwendeten farben auslesen
            2. vergisst du transparenz bei jpegs besser; ohne alpha-kanal definitiv, da rauschen im bild je nach kompression. obs mit alpha klappt, hab ich noch nie getestet.


            teste den spass mal mit einem 8bit png:

            PHP-Code:
            $src_img imagecreatefrompng($_FILES['datei']['tmp_name']);
            $dst_img imagecreate($orig_breite_src_img$orig_hoehe_src_img);
            $white imageColorAllocate ($dst_img255255255);
            imagecolortransparent($dst_img,$white);
            imagecopy($dst_img$src_img0,0,0,0$orig_breite_src_img$orig_hoehe_src_img);

            $dst_img2 imagecreate($neu_w,$neu_h);
            imageCopyResampled($dst_img2$dst_img0000$neu_w$neu_h$alt_w$alt_h);
            imagepng($dst_img2'dateiname'); 
            Kissolino.com

            Kommentar


            • #7
              Original geschrieben von Wurzel
              rembrandt? du kannst die img-resourcen hin-und-her-kopieren/-resizen/-farbverändern etc. pp wie du lustig bist.
              hm, hab's jetzt anhand deines Codes unten verstanden...aber ob das einen Unterschied macht

              2. vergisst du transparenz bei jpegs besser; ohne alpha-kanal definitiv, da rauschen im bild je nach kompression. obs mit alpha klappt, hab ich noch nie getestet.
              wie kommst du denn jetzt auf jpegs?


              teste den spass mal mit einem 8bit png:

              PHP-Code:
              $src_img imagecreatefrompng($_FILES['datei']['tmp_name']);
              $dst_img imagecreate($orig_breite_src_img$orig_hoehe_src_img);
              $white imageColorAllocate ($dst_img255255255);
              imagecolortransparent($dst_img,$white);
              imagecopy($dst_img$src_img0,0,0,0,
                
              $orig_breite_src_img$orig_hoehe_src_img);

              $dst_img2 imagecreate($neu_w,$neu_h);
              imageCopyResampled($dst_img2$dst_img0000,
                
              $neu_w$neu_h$alt_w$alt_h);
              imagepng($dst_img2'dateiname'); 
              hab ich heute leider keine Zeit mehr zu (auch wenn mich das Thema mitweile sehr interessiert ), vielleicht morgen (also heute) Abend...
              Zuletzt geändert von ghostgambler; 12.08.2005, 01:38.

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                wie sieht das mit gifs aus?
                funktionieren da auch nur 8bit farbtiefe oder mehr?

                Kommentar


                • #9
                  Original geschrieben von ghostgambler
                  hab ich heute leider keine Zeit mehr zu (auch wenn mich das Thema mitweile sehr interessiert ), vielleicht morgen (also heute) Abend...
                  Also, das Ergebnis mit dem Standard-Bild ist schöne Transparenz, aber häßliche Farben...
                  Das Ergebnis mit einem auf VIER Bit reduziertem Bild, ist häßliche Transparenz, weil das Bild 2 Farben als transparent markiert, aber nur eine beachtet wird und (für die Farbpalette) häßliche Farben...

                  das mit den Gif probier ich gleich mal aus, auch wenn das für mich keine Option darstellt, ich brauche wenn pngs...

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Original geschrieben von st@tic
                    wie sieht das mit gifs aus?
                    funktionieren da auch nur 8bit farbtiefe oder mehr?
                    also mit wurzel's code funktioniert weder das eine noch das andere...und eigentlich hab ich png-Problem zu lösen, ich will jetzt nicht noch ein gif-Problem lösen was ich eigentlich gar nicht habe XD~

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      quark, natürlich "geht" das: http://www.megasprueche.de/testpng/
                      mit png auf png (8bit) + png auf jpeg

                      @static
                      schon ein 16bit gif gesehen? ich nicht
                      Kissolino.com

                      Kommentar


                      • #12
                        nachtrag:

                        kann sein dass mein cache verrückt spielt (keine lust das näher zu testen). geht aber auch mit png nachträglich transparent machen http://www.megasprueche.de/testpng/index2.php

                        eventuell musst du das in 2 schritten machen:
                        1. bilder mischen => speichern
                        2. gemischtes bild neu laden, verkleinern speichern

                        ... und komm mir nicht wieder mit "geht nicht"
                        Kissolino.com

                        Kommentar


                        • #13
                          Das Problem ist ein nicht vorhandensein eines 8Bit PNGs, ich brauche wesentlich mehr Bit T_T
                          http://www.mangacarta.de/ghostgamble...ostGambler.png
                          deshalb kann ich mit imagecreate eigentlich nicht's reißen....
                          Abgesehen von 2 Farben, die Transparent sein sollten und da wurde mir grade von explizit hoher Stelle (Amen mein neuer Mentor, der wirklich Ahnung hat...) gesagt, dass das nur mit ein paar Hacks im Source möglich sei und selbst dann nicht 100%tig -.-

                          Momentan versuch ich an imagemagick ranzukommen und auf ein Wunder von dem Ding zu hoffen...aber all-inkl ist da irgendwie..."gegen", bzw. unfähig Sessions und imagemagick in einem Skript zu ermöglichen, weil der /tmp-Ordner ja mit sowenig Rechten wie möglich versehen ist
                          war gestern besonders lustig, als dann bei jedem 5. Seitenaufruf, eine Fehlermeldung des Garbage-Collectors auftauchte, dass er nicht auf das /tmp-Verzeichnis zugreifen könne...und der Support dachte es wäre erledigt, wenn man &~E_NOTICE an's error_reporting hängt...womit nicht gerechnet wurde: Eigener error_handler, der das ganze nutzlos macht....jetzt ist der GC aus und mit imagemagick quäle ich den Support auch solange, bis das so ist, dass ich es (vernünftig) benutzen kann *g*

                          Aber wenn noch wem ein Kronleuchter für GD aufgeht, immer her damit (@wurzel oder wenn du das auch noch gelöst bekommst )

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            Original geschrieben von ghostgambler
                            also mit wurzel's code funktioniert weder das eine noch das andere...und eigentlich hab ich png-Problem zu lösen, ich will jetzt nicht noch ein gif-Problem lösen was ich eigentlich gar nicht habe XD~
                            naja ich hatte so ein ähnliches problem mitm wasserzeichen, wobei es bei mir wahrscheinlich an der gd version aufm server liegt, da lokal alles einwandfrei funktioniert.

                            Kommentar


                            • #15
                              Also ich bin jetzt auf imagemagick umgestiegen, hat zwar etwas gedauert *all-inkl tritt*, weil der exec-Aufruf nur in CGI erlaubt ist, aber die Sessions normalerweise nicht gleichzeitig von CGI und ApacheHandler benutzt werden können, aber nach 4 Stunden Support quählen, viel dem Typen dann eine Lösung dazu ein

                              PHP-Code:
                              $ext_konvert_to = array('bmp'        => 'jpeg',
                                                      
                              'jpeg'        => 'jpeg',
                                                      
                              'gif'        => 'png',
                                                      
                              'png'        => 'png');

                              $bild exec('identify ' $_FILES['datei']['tmp_name']);
                              if (
                              $bild != '')
                                  
                              $bild explode(' '$bild);
                              else
                                  
                              $bild = array('''''''');

                              $ext strtolower($bild[1]);
                              if (
                              in_array($extarray_keys($ext_konvert_to)))
                              {                                                                
                              // Hier die Größe des Thumbs
                                  
                              exec('convert ' $_FILES['datei']['tmp_name'] . ' -resize 80x80 ' $_SERVER['DOCUMENT_ROOT'] . 
                                      
                              '/data/avatars/' $user_id() . '.'.$ext_konvert_to[$ext]);
                                  
                                  echo 
                              'Der Avatar wurde hochgeladen!';
                              }
                              else
                              {
                                  
                              trigger_error('Du kannst nur png, jpg, gif und bmp-Dateien hochladen, wobei bmp-Dateien
                                      in jpg und gif in png-Dateien konvertiert werden!'
                              );
                              }
                              // Kleinere Bilder als die 80x80 werden einfach kopiert, bzw. noch konvertiert wenn es das Array oben angibt 
                              funktioniert perfekt mit jeglicher Art von Transparenz mit der ich es probiert habe (also das Testbild von oben mit schwarz und weiß als transparent ^^)

                              Also Leute wenn möglich auf imagemagick umsteigen, GD ist für Thumbs einfach deplatziert (allein schon wegen den ganzen Formaten die imagemagick alle konvertieren kann ^^)...zumindest bei meinem Verwendungszweck

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X