Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [GD] Tekst w gradiencie
Forum PHP.pl > Forum > PHP
decha-design
Witam,

Potrzebuję napisać na pliku graficznym tekst, który nie będzie w jednolitym kolorze, tylko w gradiencie. Dokładnie to potrzebuję:

Gradient od białego do #c78c00 (199,140,0). Męcze się z tym już ze 2 godziny i nie mam pojęcia jak to zrobić. W necie jest tylko jak wypełnić tło gradientem. A tak w ogole, to jest to możliwe?

Z góry thx.

Pzdr.
flashdev
Na pewno jest mozliwe. Jeden z prostszych sposobów, choć niekoniecznie najwydajniejszych może być taki:

Tworzysz osobną bitmapę, na której wypisujesz swój tekst.
Robisz podwójnie zagnieżdżoną pętlę po iksie i igreku obrazka z tekstem.
I w miejscu gdzie masz piksel w kolorze wypisanego tekstu umieszczasz piksel odpowienio w miejscu swojej grafiki, przy czym kolor ustalasz przy pomocy funkcji, którą sobie zdefiniujesz. Moze to być najprostrza zależąca np tylko od iksa, dla koloru #c78c00: rgb=[x/width*0xc7, x/width*0x8c, x/width*0x0]

Edit:
Mam nadziej, że ten bełkot jest zrozumiały, ale jak cos to moge napisać kawałek kodu dla poparcia swojej teorii.
decha-design
Cytat(flashdev @ 3.01.2009, 17:48:42 ) *
Mam nadziej, że ten bełkot jest zrozumiały, ale jak cos to moge napisać kawałek kodu dla poparcia swojej teorii.
No powiedzmy haha.gif

Cytat(flashdev @ 3.01.2009, 17:48:42 ) *
Robisz podwójnie zagnieżdżoną pętlę po iksie i igreku obrazka z tekstem.
Nie bardzo wiem co to jest podwojnie zagnieżdzona pętla haha.gif nie spotkalem się z czymś takim jeszcze =))

Z resztą sobie raczej poradze
nospor
Cytat
co to jest podwojnie zagnieżdzona pętla
Jest to petla w petli
  1. <?php
  2. for ($x=0;$x<10;$x++)
  3. for ($y=0;$y<10;$y++)
  4. echo "x: $x, y:$y";
  5. ?>
flashdev
Cytat(decha-design @ 3.01.2009, 18:07:51 ) *
Nie bardzo wiem co to jest podwojnie zagnieżdzona pętla haha.gif nie spotkalem się z czymś takim jeszcze =))


Rzeczywiście troche masło maślane. Jednak z kontekstu moznabyło się domyślić tak jak nospor to zrobił.
bim2
Zależy w którą stronę chcesz gradient smile.gif Jak w pionie to zależnie od Y zmieniasz kolor.
legorek
Szybciej według mnie będzie stworzyć gradientowe tło. Następnie drugi np biały obrazek z czarnym tekstem i zdefiniować czarny jako kolor przezroczysty imagecolortransparent" title="Zobacz w manualu PHP" target="_manual i wstawić na stworzony gradient. Szybsze niż badanie koloru każdego piksela.
bim2
Według Ciebie. smile.gif Zrób test i się zobaczy. Mi osobiście się testów robić nie chce, ale nie wiemy jak działa nałożenie obrazka itd. Równie dobrze sposób z porównywaniem pikseli może być wydajniejszy ^^
legorek
Napisałem, że według mnie. Ewentualne testy i wybór metody pozostawiam autorowi, gdyż też mi się nie chce. Ależ my jesteśmy leniwi smile.gif
wrzasq
nie wydaje mi się, bo musisz za każdym razem odwoływać się przez funkcję w PHP do zasobów, zamiast wywołać jedną funkcję API, która za ciebie to zrobi. też bym zrobił tak, jak legorek. i na zdrowy rozsądek tak powinno być lepiej, ale na pewno trzeba by to sprawdzić.

ale sprawdź, czy nie masz rozszerzenia ImageMagick zainstalowanego, na pewno będzie łatwiej tam takie rzeczy robić smile.gif.

-edit-

aha, no i nie jestem pewien, jak tam GD sobie daje radę z zachowywaniem przezroczystości winksmiley.jpg.
bartg
Daje rade smile.gif
decha-design
Cóż, mój 'pierwszy raz' z GD haha.gif więc nie oczekujcie nic dobrego haha.gif Bawie się z tlem (na razie) i mi nie idzie ... tzw. gradient jest ale od czarnego do tego na samym dole.

  1. <?php
  2. for($y=0;$y<$this->height;$y++) {
  3.                
  4.                $bgc = imagecolorallocate($this -> img, $y/$this->height*0xc7, $y/$this->height*0x8c, 0x0);
  5.                
  6.                imagefilledrectangle($this->img, 0, $y, $this->width, $y, $bgc);
  7.                
  8.            }
  9. ?>


Mam coś takiego, i jak zrobić, aby kolor na górze byl dowolny? np. zielony? ...
flashdev
Cytat(bim2 @ 4.01.2009, 00:20:07 ) *
Według Ciebie. smile.gif Zrób test i się zobaczy. Mi osobiście się testów robić nie chce, ale nie wiemy jak działa nałożenie obrazka itd. Równie dobrze sposób z porównywaniem pikseli może być wydajniejszy ^^


Oczywiscie, ze będzie szybciej smile.gif
Napisałem, że to moje rozwiązanie nie jest wydajne, a nie znałem innego ponieważ słabo znam PHP i wszystkie jego funkcje.
Opcja legorek jest o tyle lepsza, ze nie przechodzi małowydajną pętlą skryptową przez wszystkie piksele, tylko korzysta z funkcji napisanych optymalnie w c++, asemblerze czy innym jezyku.
Takie rozwiązanie zawsze będzie szybsze i to bardzo. Nie chce wprowadzać w błąd ale tego typu funckje napisane w języku skryptowym jak php mogą być tak orientacyjnie 2-3 rzędy wolniejsze.
bim2
Jeśli mówisz orientacyjnie to znaczy, że nie sprawdzałeś winksmiley.jpg Nigdy nie wiadomo, może okazać się, że coś jest spieprzone w bibliotece i działa dłużej :] Nie lubię jak ktoś mówi bez pokrycia. smile.gif Jak nie przeprowadzisz testów wydajności, nie dowiesz się co jest wydajniejsze. Choć na logikę rozwiązanie legorek powinno być szybsze.
flashdev
Ok, powiedzmy że moja teoria moze nei sprawdzić się w niektórych przypadkach - bardzo małych obrazkach ponieważ wtedy pętla przechodzi niewiele razy.
Co do bibliotek PHP nie sądze, żeby były spaprane i oddane takie do użytku ludzi. Na pewno nie aż tak spaprane.
Jeśli chodzi o wyższość kodu skompilowanego nad interpretowanym to zaraz moge zrobić mały test i porównać php z c++. Oczywiscie nic nie stoi na przeszkodzie, aby biblioteki były pisane w assemblerze.

Edit:
Kod
<?php
function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

$time=getmicrotime();

$a;
$i=10000000;

while($i--){
$a+=i;
}

echo getmicrotime()-$time; // ~24 sekundy

?>

#include <iostream>
#include <stdlib.h>
#include <time.h>

int main()
{
  int seconds = time (NULL);
  
  int a;
  int i=10000000;
  i*=1000;
  while(i--){
    a+=i;
  }
  
  printf("%d\n\n", time (NULL)-seconds); // ~7 sekund
  system("PAUSE");    
  return 0;
}


Dla php wyszło około 24 sekundy a dla c++ około 7 sekund, przy czym musiałem troszkę zwiększyć zakres (zmienną i) ponieważ ciężko określić jaka liczba po zaokręgleniu daje 0.
To tylko prosty przykład pokazujący jaka jest przepaść pomiędzy czasem wykonywania kodu skompilowanego a kodu interpretowanego.
Wnioski można samemu wyciągnąć smile.gif
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.