Farbe bildpunkte in transparenter Grafik

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

  • someRookie
    antwortet
    Zitat von AmicaNoctis Beitrag anzeigen
    Hallo,

    darf ich dir noch einen Tipp mit auf den Weg geben? Wenn du diese Variable $argb nennst, wirst du ab in 4 Wochen denken, dass es wirklich eine TrueColor-Farbe mit Alphakanal ist, die dort zurück kommt. Bei GIF ist es aber wie gesagt nur der Index auf die Farbpalette, also wäre $index oder $idx der bessere Variablenname.

    Gruß,

    Amica

    Na klar !!! Dankeschön... das ist recht warscheinlich, wenn ich mich mehr damit beschäftige und nach ein para wochen da mal reinschaue

    ich werds gleich umbennen !

    Vielen Dank nochmals !

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Hallo,

    darf ich dir noch einen Tipp mit auf den Weg geben? Wenn du diese Variable $argb nennst, wirst du ab in 4 Wochen denken, dass es wirklich eine TrueColor-Farbe mit Alphakanal ist, die dort zurück kommt. Bei GIF ist es aber wie gesagt nur der Index auf die Farbpalette, also wäre $index oder $idx der bessere Variablenname.

    Gruß,

    Amica

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    Zitat von AmicaNoctis Beitrag anzeigen
    ...
    imagecolorat liefert für indizierte Bilder nicht die Farbe zurück, sondern den Index. Den musst du nur mit $transIndex vergleichen.
    Hallo,

    ich hab nun mit imagecolortransprent() den index ermittelt, dieser ist in dem Bild 255.

    Das scipt läuft wie gewünscht, und zählt nun die Transparenten Pixel die sich in einem GIF befinden.
    .
    Dafür wollte ich Danke sagen!

    Hier der kleine Code-Schnipsel, falls mal jemand nach ähnlichem sucht!

    PHP-Code:
    $transparentPixel   0;
    $coloredPixel       0;
    $img          imagecreatefromgif 'images/pic.gif' ); 
    $transIndex   imagecolortransparent($img);// Ermittelt Index für Transparenz
    $w            imagesx($img);
    $h            imagesy($img);

    for (
    $y 0$y $h; ++$y
    {
      for (
    $x 0$x $w; ++$x
      { 
         
    $argb  imagecolorat($img$x$y); 
      
        (
    $argb==$transIndex) ? $transparentPixel++:$coloredPixel++;// Vergleich Index jedes Pixel mit $transIndex
        
      
    }

    echo 
    "Alle Pixel: ".($transparentPixel+$coloredPixel)."<br>";
    echo 
    "Transparent Index: ".$transIndex."<br>";
    echo 
    "Transparente Pixel: ".$transparentPixel."<br>";
    echo 
    "Farbige Pixel: ".$coloredPixel."<br>"

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    man man

    da denkt man farbe ist farbe... und wird überrascht von einer tiefen materie bei der es erstmal heisst.... wisse und lerne

    ich werd mir das hier mal ausrucken und ein paar mal lesen, damit das auch tiefer hängen bleibt !

    danke jedenfalls für diese wertvolle exkursion in farbe und php

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Zitat von wahsaga Beitrag anzeigen
    Alphatransparenz hingegen geht von 0 (ganz durchsichtig) bis 255 (komplett undurchsichtig), stufenweise.
    Auch wenn das im Allgemeinen für den Alphakanal so zutrifft, im Umgang mit den GD2-Funktionen in PHP muss man etwas umdenken: GD2 speichert tatsächlich die Transparenz und nicht die Opazität (Alphakanal) und das aber nur mit 7bit. Dadurch ist 0 in PHP opak und 127 ist transparent.

    Einen Kommentar schreiben:


  • wahsaga
    antwortet
    Zitat von someRookie Beitrag anzeigen
    so färbt man dann sicher auch gifs nach "farbtönen" um, wenn ich das gleich mal weiterdenken kann ?
    Richtig, wenn du einen Farbwert in der Palette änderst, ändern sich dann alle Punkte, die im Bild auf diesen Index referenzieren.

    und alphakanal speichert transparenz direkt als farbton und nicht als index in einer tabelle ?
    GIF kann nur einfache Transparenz, voll durchsichtig oder voll undurchsichtig.

    Alphatransparenz hingegen geht von 0 (ganz durchsichtig) bis 255 (komplett undurchsichtig), stufenweise. Und ist auch nicht an Farbwerte in irgendeinem Index gebunden, sondern wird für jeden Bildpunkt separat abgelegt.

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    ey klasse !
    die erklärung für index liest sich absolut verständlich, sollte mal irgendwo festgehalten werden, nich nur in meinem thread hier !

    ich sehe beim exportieren auch immer so eine tabelle, aller im gif enthaltenen farben.. das wird dann wohl der gesamte index sein...

    so färbt man dann sicher auch gifs nach "farbtönen" um, wenn ich das gleich mal weiterdenken kann ?



    und alphakanal speichert transparenz direkt als farbton und nicht als index in einer tabelle ?

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Zitat von someRookie Beitrag anzeigen
    Die Lösung soll nur für GIF funktionieren !
    In GIF haben die einzelnen Pixel keine Farbe sondern einen Index. Außerdem enthält ein GIF eine Farbpalette. Das ist eine Tabelle, in der für jeden solchen Index die Farbe gespeichert ist. Ändert man einen Eintrag in dieser Palette, ändert sich automatisch die Farbe aller Pixel, die auf diesen Eintrag zeigen.

    Indextransparenz ist in GIF so gelöst, dass ein Index (also ein Paletteneintrag) als transparent definiert wird.

    imagecolortransparent($img) gibt dir diesen Index zurück, der im Bild als transparent definiert ist und den speicherst du, z. B. in $transIndex.

    imagecolorat liefert für indizierte Bilder nicht die Farbe zurück, sondern den Index. Den musst du nur mit $transIndex vergleichen.

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    Zitat von AmicaNoctis Beitrag anzeigen
    Ein paar Fragen, um das Büffeln zu beschleunigen: Weißt du, was der Unterschied zwischen indiziert und TrueColor ist? Weißt du, was eine Farbpalette ist? Weißt du, was der Unterschied zwischen Alphatransparenz und Indextransparenz ist? Soll die Lösung nur für GIF funktionieren oder auch für JPEG, PNG, ...?
    Unterschied inidziert- TrueColor : Nein
    Farbpalette : ja, das sind alle enthaltenen bzw alle möglichen Farben
    Alpha/index : Bruchstückhaft ? alphatransparenz stell in GIf keine wirkliche transparenz dar, sondern die indextransparenz ?

    Die Lösung soll nur für GIF funktionieren !

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Ein paar Fragen, um das Büffeln zu beschleunigen: Weißt du, was der Unterschied zwischen indiziert und TrueColor ist? Weißt du, was eine Farbpalette ist? Weißt du, was der Unterschied zwischen Alphatransparenz und Indextransparenz ist? Soll die Lösung nur für GIF funktionieren oder auch für JPEG, PNG, ...?

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    oh wow... da muss ich wohl ganz klar noch Büffeln, damit ich die Antwort überhaupt erst einmal verstehe

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Zitat von someRookie Beitrag anzeigen
    liegt das eventuell daran, wie ich das bild mit [COLOR=Blue]imagecreatefromgif()[/COLOR] öffne ?
    Ja, fireweasel wies bereits darauf hin, dass das nur für TrueColor funktioniert. Für indizierte Bilder musst du es zusätzlich mit [FONT="Courier New"]imagecolorsforindex($img, imagecolortransparent($img))[/FONT] abgleichen.
    Zuletzt geändert von AmicaNoctis; 02.10.2009, 13:41.

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    Hallo fireweasel,

    ich hab das ganze mal ausprobiert und hoffentlich dein $alpha!==0 richtig umgesetzt, allerdings stimm mein Ergebnis nicht

    Entweder stimmt was an meinem Grafikformat nicht oder mein script selbst hat ein Fehler !?

    ich hab die zugrundeligende Grafik mal geöffnet und es besitzt ein Transprarenten Hintergrund, daher denke ich mal, dass mein script irgendwo falsch abläuft.. kann das sein ?

    liegt das eventuell daran, wie ich das bild mit [COLOR=Blue]imagecreatefromgif()[/COLOR] öffne ?


    PHP-Code:
    $alphaPixel   0;
    $coloredPixel 0;
    $img imagecreatefromgif 'images/pic.gif' );

    $w imagesx($img);
    $h imagesy($img);
    for (
    $y 0$y $h; ++$y
    {
      for (
    $x 0$x $w; ++$x
      {
        
    //nur fuer TrueColour-Images!
        
    $argb  imagecolorat($img$x$y); // true-colour RGB + alpha
        
    $rgb   0xffffff $argb// true-colour RGB
        
    $alpha = (0xff000000 $argb) >> 24;
        
    $alpha = ($alpha <= 127) ? $alpha 0;
        
    // alle Pixel mit $alpha !== 0 sind transparent
        
    if($alpha!==0)
        {
            
    $alphaPixel++;
        }
        else
        {
            
    $coloredPixel++;    
        }
        
    #echo $alpha."<br>";
        // ...
        // zählen
        // ...
      
    }

    echo 
    "Alle Pixel: ".($alphaPixel+$coloredPixel)."<br>";
    echo 
    "Transparente Pixel = ".$alphaPixel."<br>";
    echo 
    "Farbige Pixel: ".$coloredPixel."<br>";

    // Ausgabe 
    // Alle Pixel: 250390
    // Transparente Pixel: 0
    // Farbige Pixel: 250390 

    Einen Kommentar schreiben:


  • fireweasel
    antwortet
    Zitat von AmicaNoctis Beitrag anzeigen
    Dort muss natürlich das Dollarzeichen weg.
    Yep, wird sofort entfernt, Meister|Mistress!

    Ich hadere noch mit einer (für mich) neuen Tastatur und geändertem Tastaturlayout, da bin ich schon froh, dass man überhaupt noch erkennt, was ich ursprünglich tippen wollte ...

    Einen Kommentar schreiben:


  • someRookie
    antwortet
    Zitat von fireweasel Beitrag anzeigen
    Jaja, heutzutage geht ohne Google anscheinend nichts mehr ...



    PHP-Code:
    .. 
    Wie du siehst, geht das ganz einfach. Leider ist diese Methode auch nicht gerade besonders schnell.

    Der Rest ist Prozentrechnung ...
    uppss... das is ja ne ganze Lösung
    war schon dabei zu tüfteln, was die RGB´s für werte haben usw und nu lese ich hier gleich ne ganze Antwort *erfreutbin*

    die Geschwindigkeit ist nicht ganz so wichtig, dieser vorgang wird eigentlich nur alle 15 minuten einmal durchgeführt.

    Einen Kommentar schreiben:

Lädt...
X