Generowanie tła za pomocą php, następnie pisanie po nim

0

Generuje sobie tak tło i potem na nim rysuje linie oraz pisze tekst:

$background = 'images/anti_robotic_reg/kapczh/anti_robotic_reg.png';
$cap = imagecreatefrompng($background);
$color = imagecolorallocate($cap, 0, 0, 0);

Jednak postanowiłem załadować tło funkcją PHP no bo po co marnować czas na ładowanie obrazka, skoro to prostokąt niebieski... Zrobiłem coś takiego:

$background = ImageCreate(195,63);
$bg = ImageColorAllocate($background,239,239,o255);
$cap = imagePng($background);
$color = imagecolorallocate($cap, 0, 0, 0);

Problem w tym, że teraz zmienna $cap nie jest obsługiwana, głównie przez funkcje imagecolorallocate() i ni cholery nie wiem czemu. Przypuszczam, że przez to, iż w zmiennej $cap kryje się funkcja imagePng(), zamiast wcześniej użytej - createimagefrompng(). Tylko dlaczego ta funkcja jest nieobsługiwana ? Jakiś zamiennik może?

0

Ja myślę, że to przez to, że nie czytasz dokumentacji:
http://pl1.php.net/imagepng

edit: A ogólnie to po prostu użyj swojego $background dalej, skoro tylko pobierasz sobie kolory.
I masz błąd:
ImageColorAllocate($background,239,239,o255); - o255 - zapewne ukryte wszelakie błędy i ostrzeżenia, więc w ostateczności ewaluuje Ci się to do zera.

0

Robię coś dalej i czytam manuala.. Stary kod, pobierający tło z pliku, działający:

$gen_reg_key = $key;
header('Content-Type: image/png');

$background = 'images/anti_robotic_reg/kapczh/anti_robotic_reg.png';
$fonts = glob('images/anti_robotic_reg/kapczh/*.TTF');
$num_letters = 5;
$cap = imagecreatefrompng($background);
$lines = imagecolorallocate($cap, 0, 0, 0);
$color = imagecolorallocate($cap, 0, 0, 0);

for($x = 1; $x <= 2; $x++) // create lines on image
 imageline(
  $cap,
  $x+13,
  $x+32,
  ($x+8*18),
  $x+32,
  $lines
 );

for($x = 1; $x <= $num_letters; $x++) // create letters on image
{
 $font = $fonts[array_rand($fonts)];
 $generate_letter     = substr($gen_reg_key, ($x-6), 1); // $gen_reg_key, ($x-(2*$x)), 1) // $gen_reg_key, ($x-6), 1)
	
 $break_letters = ($x+2)*(13+$x);
	
 imagettftext(
  $cap,
  rand(27, 32),
  -20+($x*10),
  $break_letters,
  45,
  $color,
  $font,
  $generate_letter
 );
}

imagepng($cap);
?>

Nowy kod, wyświetlający tylko tło (dalsza częśc jest ignorowana bo imagecolorallocate() nie umie obsłużyć zmiennej $cap):

$gen_reg_key = $key;
header('Content-Type: image/png');

$background = ImageCreate(195,63);
$bg = ImageColorAllocate($background,239,239,255);
$fonts = glob('images/anti_robotic_reg/kapczh/*.TTF');
$num_letters = 5;
$cap = imagePng($background);
$lines = imagecolorallocate($cap, 0, 0, 0);
$color = imagecolorallocate($cap, 0, 0, 0);

for($x = 1; $x <= 2; $x++) // create lines on image
 imageline(
  $cap,
  $x+13,
  $x+32,
  ($x+8*18),
  $x+32,
  $lines
 );

for($x = 1; $x <= $num_letters; $x++) // create letters on image
{
 $font = $fonts[array_rand($fonts)];
 $generate_letter     = substr($gen_reg_key, ($x-6), 1); // $gen_reg_key, ($x-(2*$x)), 1) // $gen_reg_key, ($x-6), 1)
	
 $break_letters = ($x+2)*(13+$x);
	
 imagettftext(
  $cap,
  rand(27, 32),
  -20+($x*10),
  $break_letters,
  45,
  $color,
  $font,
  $generate_letter
 );
}

imagepng($cap);
?>
0

No to zajrzyj do dokumentacji i powiedz jakie możliwe wartości zwraca imagepng i jakiego typu zmiennej oczekuje imagecolorallocate

0

Dobra, wiem, że masz mnie za durnia bo wszystko teoretycznie jest w manualu. Zdaje sobie sprawe, że imagecolorallocate () oczekuje konkretnego obrazu, a imagepng zwraca true lub false. Ale moje pytanie brzmi - jaką funkcję tam podstawić aby miała takie samo działanie jak imagecreatefrompng ? Tylko jakbyś mógł - nie odsyłaj mnie do manuala. Widziałem 'See also'.

0

musiałbyś zapisać ten obraz na dysku, a potem go wczytać jeszcze raz -- jeszcze większa strata na wydajności.
ale zauważ, że w tamtym momencie nie masz jeszcze żadnego obrazu, więc po co jakieś imagepng? pusty obrazek już chcesz zapisywać?
w kolejnych imagecollorallocate podawaj po prostu $background (o czym napisałem w pierwszej odpowiedzi w edicie)
a żeby w ogóle wypełnić tło (w tym momencie jedynie zapisałeś sobie zmienną z kolorem!) to masz: imagefill
warto się zapoznać z listą funkcji

szkoda tylko, że podobno czytasz manual, a ja tych informacji nie biorę z kosmosu tylko z manuala...

1 użytkowników online, w tym zalogowanych: 0, gości: 1