Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak uzyskać kolory piksela?
spenalzo
post 21.08.2003, 21:03:40
Post #1





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ść :-)


--------------------

Go to the top of the page
+Quote Post
adwol
post 21.08.2003, 21:21:20
Post #2





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
spenalzo
post 21.08.2003, 22:47:04
Post #3





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.


--------------------

Go to the top of the page
+Quote Post
spenalzo
post 22.08.2003, 00:58:49
Post #4





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ą?


--------------------

Go to the top of the page
+Quote Post
adwol
post 22.08.2003, 01:31:31
Post #5





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
spenalzo
post 22.08.2003, 01:35:59
Post #6





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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


--------------------

Go to the top of the page
+Quote Post
adwol
post 22.08.2003, 01:41:03
Post #7





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
spenalzo
post 22.08.2003, 01:51:39
Post #8





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.


--------------------

Go to the top of the page
+Quote Post
uboottd
post 22.08.2003, 09:23:15
Post #9





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.08.2025 - 16:49