Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nakładanie niebieskiej maski na obrazek.
Forum PHP.pl > Forum > PHP
Flapper
Mój problem jest następujący, muszę użyć GD library z którego nigdy wcześniej nie korzystałem i nie mam pojęcia co i jak, a w manualu znalazłem ledwie 3 przykłady i raczej nie rozjaśniły mi zbytnio tematu więc zwracam się o pomoc.
Jeśli dobrze rozumuję to powinienem zacząć od:
$obrazek = imagecreatefrompng('obrazek.png')
Dalej jakoś wypełnić wszystko poza alfą niebieskim kolorem.
Zostanie jeszcze zapisać wynik chyba przy pomocy imagepng() nałożyć na siebie 2 obrazki ale z tym już sobie poradzę. Na razie największy problem to wypełnianie kolorem wszystkiego poza alfą.
Z góry dziękuję i pozdrawiam. smile.gif
#luq
Chcesz wszystkie pixele zamienić na niebieski (RGB = 0,0,255) czy chcesz wypełnić to odcieniami niebieskiego liczonymi z oryginalnych pixeli?

Jeśli chcesz przelecieć po wszystkich pixelach i coś z każdym zrobić (zamienić, sprawdzić itp.) to wystarczy prosty kodzik:
  1. <?php
  2.    $img = imagecreatefrompng( 'image.png' );
  3.  
  4.    $width = imagesx( $img );
  5.    $height = imagesy( $img );
  6.    $color = imagecolorallocate( $img, 0, 0, 255 );
  7.  
  8.    for( $i = 0; $i < $height; $i++ ){
  9.        for( $j = 0; $j < $width; $j++ ){
  10.            imagesetpixel( $img, $j, $i, $color );
  11.        }
  12.    }
  13.  
  14.    imagepng( $img, 'image_new.png' );
  15. ?>


Co do kanału alpha to trzeba najpierw ustawić
  1. <?php
  2. imagealphablending( $img, false );
  3.    imagesavealpha( $img, true );
  4. ?>

a kolor stworzyć za pomocą
  1. <?php
  2. imagecolorallocatealpha();
  3. ?>



Dużo szybciej i prościej przekształca się grafiki używając klasy przeznaczonej do tego celu. Możesz zajrzeć w moją: http://luq10.wordpress.com/2009/03/17/filt...raficzne-w-php/
Flapper
I później tą alfę robię dodając mniejwięcej taki if:

If (*kolor pixela* != *kolor alfy*){
imagesetpixel( $img, $j, $i, $color );
}

Dobrze myślę?
#luq
Szczerze to nie wiem co dokładnie chcesz zrobić.

Porównywanie kanału alpha z kolorem pixela jest bez sensu. Kanał alpha definiuje w jakim stopniu dany pixel jest przezroczysty i jest to wartość z zakresu 0-127 natomiast pixel jak wiadomo składa się z 3 podstawowych kolorów RGB które to określają ostateczną barwę pixela i są z zakresu 0-255. Nie wiedzę najmniejszego sensu aby wartość poszczególnych składowych koloru porównywać z wartością kanału alpha.
Flapper
Generalnie, to chcę załadować plik png, zamienić wszystkie pixele które nie są 100% przezroczyste na kolor niebieski, i zapisać to jako gif na serwerze. tongue.gif I nijak nie mam pojęcia jak się operuje alfą za pomocą GD.
Czy ktoś może mnie olśnić, jakiej funkcji użyć do sprawdzenia czy wartość alfa dla danego pixela jest równa 0?
EDIT:
Napisałem takie coś korzystając z drugiego przykładu http://pl.php.net/imagecolorat i przykładu #luq:
  1. <?php
  2. $img = imagecreatefrompng( 'img/ico/Computer1.png' );
  3.  
  4.   $width = imagesx( $img );
  5.   $height = imagesy( $img );
  6.   $color = imagecolorallocate( $img, 0, 0, 255 );
  7.   for( $i = 0; $i < $height; $i++ ){
  8.       for( $j = 0; $j < $width; $j++ ){
  9.           $rgb = imagecolorat($img, $j, $i);
  10.           $kol = imagecolorsforindex($rgb);
  11.           If ($kol[alpha] > 60){
  12.           imagesetpixel( $img, $j, $i, $color );
  13.       }
  14.       }
  15.   }
  16.  
  17.   imagegif( $img, 'img/ico/Computer1m.gif' );
  18. ?>

I wywala to całą stronę takich errorów: "Warning: Wrong parameter count for imagecolorsforindex() in /home/b/l/o/<cenzura smile.gif >/www/mfps/to.php on line 10"
Pomocy! tongue.gif
#luq
Manual, manual, i jeszcze raz manual.

Źle używasz funkcji imagecolorsforindex(), powinieneś używać tak:
  1. <?php
  2. imagecolorsforindex( $img, $rgb );
  3. ?>
Flapper
Dzięki!
Jeszcze tylko 1 problem.
Ostatecznie mam taki kod:
  1. <?php
  2. $img = imagecreatefrompng( 'img/ico/Computer1.png' );
  3.  
  4.   $width = imagesx( $img );
  5.   $height = imagesy( $img );
  6.   $color = imagecolorallocate( $img, 0, 0, 255 );
  7.   $color2 = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
  8.   for( $i = 0; $i < $height; $i++ ){
  9.       for( $j = 0; $j < $width; $j++ ){
  10.           $rgb = imagecolorat($img, $j, $i);
  11.           $kol = imagecolorsforindex($img, $rgb);
  12.           If ($kol[alpha] != 127){
  13.           imagesetpixel( $img, $j, $i, $color );
  14.       }
  15.       else
  16.       {
  17.       imagesetpixel( $img, $j, $i, $color2 );    
  18.       }
  19.       }
  20.   }
  21.   imagesavealpha  ( $img, true);
  22.   imagegif( $img, 'img/ico/Computer1m.gif' );
  23. ?>

I daje to taki efekt:
A chciałbym żeby wszystko poza tym niebieskim było przezroczyste, więc coś musiałem namieszać w kodzie, tylko co? tongue.gif
EDIT:Ok problem rozwiązałem.
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.