Autor Zpráva
10messi10
Profil *
Dobrý den, chtěl bych Vás poprosit o radu. Mám v plánu dělat něco rozsáhlejšího, ale u jedný věci jsem se zasekl. Chtěl bych data, která budou v databázi, vypisovat na obrázek. Myslím tím, že bych v databázi měl nějaká data,třeba NICK - 10messi10 a last_activity - 24.12.2014. A to by se vypsalo na obrázek a uložilo, při každém přihlášení by se to aktualizovalo

Proto bych se chtěl zeptat, jak by to šlo udělat. vubec nemám ponětí. :(
lionel messi
Profil
10messi10:
Môžeš jednoducho nastaviť obrázok ako pozadie (pomocou CSS) a na neho vypisovať informácie z db ako text, ale to predpokladám nepotrebuješ.

Druhá možnosť je komplikovanejšia, ale niečo podobné asi chceš dosiahnuť, skúsim naznačiť postup:
1. Otvoríš si obrázok (predpokladajme JPG) pomocou imagecreatefromjpeg.
2. Text do obrázku ti pomôže vložiť funkcia imagestring.
3. Obrázok vypíšeš do prehliadača pomocou imagejpeg.
4. Na záver samozrejme uvoľníš pamäť imagedestroy.
10messi10
Profil *
A kdybych ten obrázek chtěl uložit s těmi daty třeba do složky upload/ a ta aktualizace by taky fungovala? :)
juriad
Profil
10messi10:
Ano, vygenerovaný obrázek můžeš uložit do souboru, ale všechnu logiku kolem (kdy se má přegenerovat, co se má stát, pokud ještě neexistuje) si musíš vymyslet a naprogramovat sám.

Tady někdo zkoušel vytvořit obrázkový status serveru. Třeba ti to pomůže.
10messi10
Profil *
Dnes ráno se na to podívám, zatím díky :)
10messi10
Profil *
Něco jsem z toho poskládal, zatím to mám takhle, ale jeden problém je, že se ten obrázek nezobrazí. Nevíte v čem by mohl být problém?
<?php
  header("Content-type: image/png");
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 0, 0);
  $text = "Test";
  $font = "helvetica.ttf";
  imagettftext($png, 15, 0, 75, 300, $ol, $font, $text);
  imagepng($png);
  imagedestroy($png);
?>
Alphard
Profil
10messi10 [#6]:
Při ladění scriptů s generovanými obrázky je nejlepší dočasně neodesílat hlavičku informující o obrázku, pak je snadnější přečíst si chybové hlášky.
lionel messi
Profil
10messi10:
Nevíte v čem by mohl být problém?
Na riadku 7 máš preklep, používaš premennú $ol, ale o tri riadky vyššie definuješ $col.
10messi10
Profil *
Hlavičku jsem dal pryč a zobrazily se takový divný znaky :D Tak jsem jí vrátil, $col jsem opravil, ale stále to nefunguje..
Chro_
Profil *
Zapni si zobrazování chyb.
<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);
//odtuď tvůj skript
?>
Ze skriptu odstraň header, imagepng a imagedestroy a spusť ho.
10messi10
Profil *
Tohle se zobrazilo,
když jsem měl zápis takhle:
<?php
  header("Content-type: image/png");
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 0, 0);
  $text = "Test";
  $font = "helvetica.ttf";
  imagettftext($png, 15, 0, 75, 300, $ol, $font, $text);
  imagepng($png);
  imagedestroy($png);
?>
Teďka, když jsem to udělal podle uživatele Chro_ tak se mi zobrazí jen reklama od endory. :D
Chro_
Profil *
To zřejmě znamená, že endora ti vkládá reklamu/text na konec souboru za ?>. Můžeš sice nastavit header na typ image, poslat obrázek na výstup funkcí imagepng, ale za výstup se přidá k proudu obrazových dat ještě text a obrázek je poškozen. Možná by pomohlo před značkou ?> vložit
exit;
?>
Tím se ukončí proces zpracovávání a odesílají se data na výstup.
10messi10
Profil *
Problém přetrvává, ani to nepomohlo. :D
Chro_
Profil *
Pár poznámek. Font helvetica.ttf je funkční a ve stejném adresáři jako testujeme.php, to je v pořádku. Načítaný obrázek tt.png 500x250 je tmavý a v imagettftext do něj jednak vypisuješ text s nastavenou černou barvou (chtělo by to světlejší) a druhak mimo obrázek, protože výška obrázku je 250 a v imagettftext máš osu Y nastavenou na 300. Výše uvedený tvůj skript nesmí být v souboru s dalšímy znaky natož HTML kódem jak před otevírací tak uzavírací značkou PHP. Pokud máš tedy soubor testujeme.php v UTF-8, zkontroluj, zda na začátku soubor neobsahuje BOM.
10messi10
Profil *
Měl jste pravdu, měl jsem to normálně v body a to dělalo tu neplechu :D Udělal jsem to takhle, jak jste napsal a funguje to tak jak má :) Děkuji mockrát :)


Chtěl jsem se zeptat, jak by se dalo udělat aby ten obrázek po zkopírování byl ve formátu .png?:D


A ještě jedna věc, jde k tomu nastavit kodování?
Chro_
Profil *
Myslíš, aby obrázek neměl název testujeme.php? Za header s content-type přidej další header.
header('Content-Disposition: inline; filename="nazevobrazku.png"');
Obrázku PNG se nenastavuje kódování. Obrázek, ať zobrazuje cokoli a je vytvořen jakýmkoliv způsobem, je zkomprimován metodou, která se znakovými sadami nepracuje.
10messi10
Profil *
Název obrázku je furt testujeme.php, nevěděl byste v čem je problém? :)
Taps
Profil
10messi10:
Mně funguje níže uvedený kod
<?php
  header("Content-type: image/png");
  header("Content-disposition: inline; filename=obrazek.png");  
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 255, 0);
  $text = "Testuji";
  $font = "helvetica.ttf";
  imagettftext($png, 35, 0, 75, 150, $col, $font, $text);
  imagepng($png);
  imagedestroy($png); 
?>  
10messi10
Profil *
Použil jsem stejný kód, který jste sem vložil a mně to ukazuje furt src="domena/testujeme.php"
xROAL
Profil
10messi10:
Použil jsem stejný kód, který jste sem vložil a mně to ukazuje furt src="domena/testujeme.php"
To je v celku pochopiteľné, keďže fyzicky sa obrázok skutočne nachádza na adrese "domena/testujeme.php".
header("Content-disposition: inline; filename=obrazek.png"); ti zabezpečí, (alebo mal by zabezpečiť) že ak si užívateľ bude chcieť obrázok stiahnuť, jeho (prednastavený) názov bude "obrazek.png".
10messi10
Profil *
Dobře, díky. CO jsem se chtěl ještě zeptat, jde udělat aby ten vzniknutý obrázek se nahrál třeba do složky obrazky/ ?
Taps
Profil
10messi10:
<?php
  /*
  header("Content-type: image/png");
  header("Content-disposition: inline; filename=obrazek.png"); 
  */
  
  $path = './obrazky/obrazek_test.png'; 
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 255, 0);
  $text = "Testuji";
  $font = "helvetica.ttf";
  imagettftext($png, 35, 0, 75, 150, $col, $font, $text);
  imagepng($png,$path);
  imagedestroy($png); 

?>  
10messi10
Profil *
Přidal jsem tam tohle:
if (isset($_POST['submit'])) {
  header("Content-type: image/png");
  header("Content-disposition: inline; filename=".$_POST['text'].".png"); 
  $path = "./tt/".$_POST['text'].".png"; 
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 255, 0);
  $text = $_POST['text'];
  $font = "helvetica.ttf";
  imagettftext($png, 35, 0, 75, 150, $col, $font, $text);
  imagepng($png, $path);
  imagedestroy($png); 
  }
  echo "<form method='POST'>";
  echo "<input type='text' placeholder='text' name='text'>";
  echo "<input type='submit' value='Ukaž' name='submit'>";
  echo "</form>";
chtěl bych se zeptat, proč když odešlu formulář tak se mi nezobrazí obrázek s textem, který y se zobrazit měl, ale zobrazí se tohle:

V rootu webu ten obrázek už je, ale tohle mi vrtá hlavou. :D
Taps
Profil
10messi10:
Pravděpodobně to bude tím že máš u funkce imagepng uvedenou cestu na kterou se má obrázek uložit. Tuto cestu však už zpětně nenačítáš do skriptu. Níže zasílám upravenou verzi skriptu
<?
if (isset($_POST['submit'])) {

  $path = "./path/".$_POST['text'].".png"; 
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 255, 0);
  $text = $_POST['text'];
  $font = "helvetica.ttf";
  imagettftext($png, 35, 0, 75, 150, $col, $font, $text);
  imagepng($png, $path);
  imagedestroy($png);
  echo '<img src="'.$path.'">'; 
  }
  echo "<form method='POST'>";
  echo "<input type='text' placeholder='text' name='text'>";
  echo "<input type='submit' value='Ukaž' name='submit'>";
  echo "</form>";  
  ?>
10messi10
Profil *
Děkuji. Snad už poslední věc z mojí strany, chci na ten obrázek vypsat a následně uloži informace z DB, avšak uloží se obrázek bez textu mohl byste mi pomoci? :)
$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='".$_GET['nick']."'");
  if(mysql_num_rows($result)==1) {
    while($result2 = mysql_fetch_array($result)){
  header("Content-type: image/png");
  header("Content-disposition: inline; filename=".$_GET['nick'].".png"); 
  $path = "./signatures/".$_GET['nick'].".png"; 
  $png = imagecreatefrompng("tt.png");
  $col = imagecolorallocate($png, 0, 255, 0);
  $text = $_GET['nick'];
  $font = "helvetica.ttf";
  imagettftext($png, 35, 0, 75, 150, $col, $font, $result2['nick']);
  imagettftext($png, 35, 0, 75, 130, $col, $font, $result2['user_posts']);
  imagepng($png, $path);
  imagedestroy($png);
  }
} else {
  echo "Uživatel neexistuje";
}



Problém vyřešen, zapomněl jsem dá do složky, ve které je zdroj. soubor, soubor .ttf
RASik
Profil *
Když už jsme u těch obrázků, snad můj dotaz souvisí, prosím o info, jak obrázek nezobrazit, ale uložit do souboru, čili:
- načtu si nějaký obrázek pomocí např. imagecreatefrom...()
- nějakým způsobem ho změním, např. doplním do něj text, vodoznak nebo změním rozměry, atp..
- uložím do souboru, např. nový_obrázek.jpg
můžete mně nasměrovat? Dík.
Keeehi
Profil
RASik:
Vždyť to dělá ten script v [#25]. Vytvoření je na řádku 7, modifikace 11 a 12 a uložení na řádku 13.
RASik
Profil *
Ježiši, to jsem vůl, používám Imagegif (apod.) tak dlouho jen pro zobrazení, že jsem zapomněl, že tam má parametr jména souboru... Omlouvám se a děkuji.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: