| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

02-10-2009, 11:46
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
Farbe bildpunkte in transparenter Grafik
hi ihr,
bin neu hier und hoffe auch gleich mal eine frage stellen zu dürfen ?
Gibt es die möglichkeit jegliche farbigen Bildpunkte innerhalb einer transparenten Grafik zu bestimmten ?
Egal in welcher Einheit, also z.B Pixelanzahl oder Prozentangabe ?
oder hat jemand eventuell eine Idee wie ich sowas releasieren könnte?
Gruss
Rene
|

02-10-2009, 11:53
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo Rene,
dazu muss man das Bild zeilenweise abtasten und mit imagecolorat die Pixelfarbe bzw. den Paletteneintrag ermitteln.
Gruß,
Amica
|

02-10-2009, 12:22
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
Hallo Amica,
dieser Vorschlag liest sich ja schon mal total klasse.
Ich weiß zwar noch nicht, wie ich zeilenweise ein Bild abtaste, aber da wird mir ja google vielleicht behiflich sein können.
imagecolorat hab ich mir aber sofort durchgelesen und das arbeitet ja genau wie gewünscht, tastet pixel ab und nennt mir den farbwert.
also probiert ich erst mal aus, was mir imagecolorat für ein wert ausgibt, wenn er auf ein transparentes pixel trifft... hoffentlich nicht den wert für weiss, denn das gehört mit zu den farbigen pixel.
Aber wenns gut funktioniert könnte ich alle transparenten pixel zählen und zu der anzahl aller pixel im bild ins Verhältnis setzen und erhalte dann ein prozentwert... oh wäre das super.
Danke schonmal für diesen anschubser !
|

02-10-2009, 12:26
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von someRookie
Ich weiß zwar noch nicht, wie ich zeilenweise ein Bild abtaste
|
Mit einer Schleife für y und darin einer weiteren Schleife für x.
|

02-10-2009, 12:55
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von someRookie
Ich weiß zwar noch nicht, wie ich zeilenweise ein Bild abtaste, aber da wird mir ja google vielleicht behiflich sein können.
|
Jaja, heutzutage geht ohne Google anscheinend nichts mehr ...
Zitat:
|
Aber wenns gut funktioniert könnte ich alle transparenten pixel zählen ...
|
PHP-Code:
$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
// ...
// zählen
// ...
}
}
Wie du siehst, geht das ganz einfach. Leider ist diese Methode auch nicht gerade besonders schnell.
Der Rest ist Prozentrechnung ...
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (02-10-2009 um 13:22 Uhr)
|

02-10-2009, 12:55
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
Zitat:
Zitat von AmicaNoctis
Mit einer Schleife für y und darin einer weiteren Schleife für x.
|
auweia ja !
Dankeschön !
|

02-10-2009, 13:04
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von fireweasel
Code:
$argb = $imageColorAt($img, $x, $y); // true-colour RGB + alpha
|
Dort muss natürlich das Dollarzeichen weg.
|

02-10-2009, 13:11
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
Zitat:
Zitat von fireweasel
Jaja, heutzutage geht ohne Google anscheinend nichts mehr ...
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.
|

02-10-2009, 13:25
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von AmicaNoctis
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 ...
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

02-10-2009, 14:15
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
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 imagecreatefromgif() ö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
|

02-10-2009, 14:25
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von someRookie
liegt das eventuell daran, wie ich das bild mit imagecreatefromgif() öffne ?
|
Ja, fireweasel wies bereits darauf hin, dass das nur für TrueColor funktioniert. Für indizierte Bilder musst du es zusätzlich mit imagecolorsforindex($img, imagecolortransparent($img)) abgleichen.
Geändert von AmicaNoctis (02-10-2009 um 14:41 Uhr)
|

02-10-2009, 14:39
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
oh wow... da muss ich wohl ganz klar noch Büffeln, damit ich die Antwort überhaupt erst einmal verstehe
|

02-10-2009, 14:46
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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, ...?
|

02-10-2009, 15:01
|
|
someRookie
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 50
|
|
Zitat:
Zitat von AmicaNoctis
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 !
|

02-10-2009, 15:14
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von someRookie
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.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|