21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Martin R.
Profil *
Jednoduchý skript na vložení textu do obrázku pomocí fce imagettftext. Font Arial.ttf mám ve stejném adresáři jako skript. Na lokále (windows PHP Version 5.3.0) se to chová jak má, ale na webhostingu (Linux PHP Version 5.2.12-pl0-gentoo) se diakritika nezobrazí (pouze standardní čtverečky). Snažil jsem se porovnat phpinfo, gd2 je stejné, vše enabled. Nějaký tip, kterým nastavením nebo chybou skriptu by to mohlo být?

<?php

putenv('GDFONTPATH=' . realpath('.'));
iconv_set_encoding('internal_encoding', 'utf-8');

class SimpleImage {

    private $image;
    private $imageNew;
    private $image_type;
    private $font = './Arial.ttf';

    function __construct() {
    }

    function load($filename) {

        $image_info = getimagesize($filename);
        $this->image_type = $image_info[2];

        if ($this->image_type == IMAGETYPE_JPEG) {
            $this->image = imagecreatefromjpeg($filename);
        }
        elseif ($this->image_type == IMAGETYPE_GIF) {
            $this->image = imagecreatefromgif($filename);
        }
        elseif ($this->image_type == IMAGETYPE_PNG) {
            $this->image = imagecreatefrompng($filename);
        }
    }

    function save($filename, $image_type=IMAGETYPE_JPEG, $compression=80, $permissions=null) {

        if ($this->image_type == IMAGETYPE_JPEG) {
            imagejpeg($this->image, $filename, $compression);
        }
        elseif ($this->image_type == IMAGETYPE_GIF) {
            imagegif($this->imageNew, $filename);
        }
        elseif ($this->image_type == IMAGETYPE_PNG) {
            imagepng($this->imageNew, $filename);
        }
    }

    function getWidth() {
        return imagesx($this->image);
    }

    function getHeight() {
        return imagesy($this->image);
    }

    function vodotiskVpravoDole($string) {

        $width	= 10 * strlen($string) ;
        $height	= 14; //ImageFontHeight($this->font);
        $im 	= $this->image;
        $x      = $this->getWidth() - $width - 10;
        $y	= $this->getHeight() - $height - 10;

        $background_color 	= imagecolorallocate ($im, 255, 255, 255); //white background
        $text_color 		= imagecolorallocate ($im, 0, 0,0);//black text

        imagettftext($im, '14', '0', $x, $y, $text_color, $this->font, $string);
        $this->image = $im;
    }
}

if (isset($_POST['ulozit'])) {
    $image = new SimpleImage();
    $image->load($_FILES['obrazek']['tmp_name']);

    $image->vodotiskVpravoDole("příliš žluťoučký kůň");

    $image->save('new.jpg');
}
?>
<form action="" method="post" enctype="multipart/form-data" name="formular" >
    <fieldset>
        <legend>Vyberte fotografii</legend><br />
        <input type="file" name="obrazek" value="vloz_obr" />
    </fieldset><br />
    <input type="hidden" name="ulozit" value="ulozit" />
    <input type="submit" name="ulozit" value="ulozit" />
    <br />

</form>

<?php
if (is_file('new.jpg')) {
    echo "<img src=\"new.jpg\" title=\"test\" alt=\"test\" />";
}
?>
AM_
Profil
Martin R.:
Nestačí použít iconv_set_encoding (možná to dokonce ani není nutné, důležité je, aby soubory byly v utf-8, jestli se nemýlím.
martinR
Profil *
AM:
iconv_set_encoding jsem zkusil použít, protože už nevím co bych. Soubory jsou v utf-8. Jak říkám, na lokálním serveru se diakrtitika v obrázku zobrazí, na webhostingu ne. Problém bude spíš v konfiguraci serveru... asi teda :(
vynalezce
Profil
zkus prijmout vypisovany text pres GET / POST pokud se zobrazi spravne, kodem to neni
AM_
Profil
jediné další co mě napadá je jestli se soubor opravdu jmenuje Arial.ttf s velkým A - to může být ten rozdíl, windows nemá case-sensitive názvy souborů, linux ano.
martinR
Profil *
vynalezce:
Takže, zkusil jsem zobrazit hlášky přes POST i js a zobrazují korektně.

Pro mě testovací hosting webzdarma zobrazuje diakritiku jak potřebuju
http://sampion.borec.cz/images.php

Na hostingu pipni.cz, taky ok.

Jediný a zásadní problém tak pro mě zůstává cesky-hosting.cz
http://sampion.borec.cz/kua.jpg

... kde ne a ne rozjet češtinu. Klidně bych se obrátil i na podporu, ale nevím, jaké parametry vlastně potřebuji přenastavit.
Alphard
Profil
Z manuálu:

The text string in UTF-8 encoding.

May include decimal numeric character references (of the form: €) to access characters in a font beyond position 127. The hexadecimal format (like ©) is supported. Strings in UTF-8 encoding can be passed directly.

Named entities, such as &copy;, are not supported. Consider using html_entity_decode() to decode these named entities into UTF-8 strings (html_entity_decode() supports this as of PHP 5.0.0).

If a character is used in the string which is not supported by the font, a hollow rectangle will replace the character.

1. Zkusil jste zadat řetězec stylem &# 8364;?
2. Script na http://sampion.borec.cz/kua.jpg je předpokládám zkušební a omezený pouze na výpis textu. Je prokazatelně v utf-8? (Na to jste již odpovídal vynalezci, ale je to zásadní.)
martinR
Profil *
Alphard:
1. Nezkusil.. ale zkusím
2. Vzhledem k tomu, že jsem na pořád začátku mé cesty za PHP nejsem si tak úplně jistý .. v editoru (phpedit) má soubor nastaveno a zobrazuje utf-8 kódování. Nebo jde ještě o něco jiného? Obrázek kua.jpg je část printscreenu z "cekeho webhostingu", kde jedině mi tohle nefunguje (na dvou jiných hostinzích nemam problém). Přídám ještě odkaz na aktuální zdrojový soubor, který je spouštěn v images.php
http://sampion.borec.cz/images.txt

Moderátor Chamurappi: Neumíš napsat odkaz jako odkaz? Do [pre] patří zdrojové kódy.
Endeer
Profil *
Tak jsem na to taky narazil, pokusil jsem se porovnat konfiguraci PHP mezi hostingem kde to šlo a kde ne a zřejmě je viníkem --enable-gd-jis-conv, podpora japonštiny u Českého hostingu. Ověřil jsem to na svém počítači na PHP 5.2.13/Slackware 13.

Tož doufám že to někdy někomu pomůže vybrat si hosting předem.

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:

0