Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak uzyskać kolory piksela?
Forum PHP.pl > Forum > PHP
spenalzo
Hej
zgodnie z tym co napisał manual, do wyciągnięcia poszczegolnych składowy (r,g i cool.gif konkretnego koloru piksela należy użyć tego:
[php:1:9fc999b2f6]<?php
$rgb=imagecolorat($im,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
?>[/php:1:9fc999b2f6]
ale nic z tego nie działa i pokazuje zawsze zero, za wyjątkiem $b - zawsze 86. Czemu?

Drugie pytanie: jak przełożyć uzyskane składowe na wartość szesnastkową (do HTMLa)? Próbowałem na różne sposoby z funkcją dechex ale nie wychodziło z tego nic, co by przypominało taką wartość :-)
adwol
Cytat
Hej
zgodnie z tym co napisał manual, do wyciągnięcia poszczegolnych składowy (r,g i cool.gif konkretnego koloru piksela należy użyć tego:
[php:1:6cbd11c2da]<?php
$rgb=imagecolorat($im,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
?>[/php:1:6cbd11c2da]
ale nic z tego nie działa i pokazuje zawsze zero, za wyjątkiem $b - zawsze 86. Czemu?

Problem występuje gdy tworzysz nowy obrazek za pomocą imagecreate() bądź wczytujesz go z pliku o formacie, który ma indeksowane kolory (np. gif). Wtedy imagecolorat() zwraca Ci indeks tego koloru, a nie faktyczną wartość RGB. Dla plików które przetrzymują kolory w postaci trójki RGB dla każdego piksela lub przy tworzeniu nowego obrazka za pomocą imagecreatetruecolor(), zwracany kolor jest w postaci RGB.
Cytat
Drugie pytanie: jak przełożyć uzyskane składowe na wartość szesnastkową (do HTMLa)? Próbowałem na różne sposoby z funkcją dechex ale nie wychodziło z tego nic, co by przypominało taką wartość :-)

[php:1:6cbd11c2da]<?php
sprintf("#%02x%02x%02x", $r, $g, $cool.gif;
?>[/php:1:6cbd11c2da]
PS. Podziękowania dla uboottda za pomoc w rozgryzieniu problemu z imagecolorat(). smile.gif
spenalzo
Cytat
Problem występuje gdy tworzysz nowy obrazek za pomocą imagecreate() bądź wczytujesz go z pliku o formacie, który ma indeksowane kolory (np. gif). Wtedy imagecolorat() zwraca Ci indeks tego koloru, a nie faktyczną wartość RGB. Dla plików które przetrzymują kolory w postaci trójki RGB dla każdego piksela lub przy tworzeniu nowego obrazka za pomocą imagecreatetruecolor(), zwracany kolor jest w postaci RGB.

Dzięki za odpowiedź.
No właśnie obrazek jest tworzony z pliku .png, który (o ile się nie mylę) ma włąśnie indeksowane kolory.

BTW: przydałoby się o tym w manualu wspomnieć, bo jest to wg mnie dosyć ważne zastrzeżenie, a tymczasem żadnej takiej notki przy funkcji imagecolorat nie ma.
spenalzo
Hmm, jednak coś nie działa...
Teraz tworzę obrazek z pliku .jpg i nadal nic - wyświetlana jest tylko ostatnia wartość (czyli niebieski) - tym razem poprawna, tzn. odpowiadająca obrazkowi. A co z resztą?
adwol
Cytat
Hmm, jednak coś nie działa...
Teraz tworzę obrazek z pliku .jpg i nadal nic - wyświetlana jest tylko ostatnia wartość (czyli niebieski) - tym razem poprawna, tzn. odpowiadająca obrazkowi. A co z resztą?

U mnie taki kod:
[php:1:8dbd54931f]<?php
$im = imagecreatefromjpeg($plik);
$rgb = imagecolorat($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
print "$r $g $bn";
?>[/php:1:8dbd54931f]
działa bez zarzutu zwracając poprawne RGB. Robisz to tak samo czy inaczej?
spenalzo
No właśne w tym problem... U mnie dokładnie taki sam kod zwraca tylko wartość koloru niebieskiego, pozostałe 2 są takie same i wynoszą 0, niezalżnie od zmiennej $x i $y.
Mam php 4.2.2
adwol
Cytat
No właśne w tym problem... U mnie dokładnie taki sam kod zwraca tylko wartość koloru niebieskiego, pozostałe 2 są takie same i wynoszą 0, niezalżnie od zmiennej $x i $y.
Mam php 4.2.2

No to niestety nic Ci więcej nie mogę pomóc. U mnie to chodzi na php 4.3.1 z libgd 2.0.12.
spenalzo
Cytat
No to niestety nic Ci więcej nie mogę pomóc. U mnie to chodzi na php 4.3.1 z libgd 2.0.12.

I ciekawostka: po zainstalowaniu GD2 problem zniknął.... rolleyes.gif
Dzięki za zainteresowanie.
uboottd
Zadna ciekawostka. W manualu stoi jak byk ze imagecolorat zwraca index koloru, chyba ze GD > 2.0 _i_ obrazek jest typu trucolor to wtedy zwraca wartosc RGB zamiast indeksu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.