Этот упрощенный скрипт выводит рисунок с текстом, но текст выводится всякими иероглифами.. В базе стоит кодировка cp1251_general_ci.. При выводе переменной $row функцией echo в броузер строка выводится нормально. PHP: <?php header("Content-type: image/png"); $db_connect = mysql_connect("localhost", "root"); mysql_select_db("db", $db_connect); $ans=mysql_query("SELECT Text from tips", $db_connect); $cntrows = mysql_num_rows($ans); mysql_data_seek ($ans, rand(0, $cntrows-1)); $row = mysql_fetch_row($mysqlanswer); $im = @imagecreate(strlen($row)*5, 50); $background_color = imagecolorallocate($im, 255, 255, 255); $text_color = imagecolorallocate($im, 0, 0, 200); imagestring($im, 0, 0, 0, $row[0], $text_color); imagepng($im); imagedestroy($im); ?> Подскажите что не так, пожалуйста.
подсказываем что не так: не так сохраняете изображения - изображения хранят в файлах, а не в базе ибо спасает от гимора.
Да пичем здесь хранение изображения? Изображение не хранится ни в базе ни в файле оно генерится в рhp скрипте и в него вставляется текст из базы... Русский текст отображается неверно, кроме знаков (. ,) и т.п.
а тагда соори. Причем здесь база тогда? Значит текст в windows-1251 листинг из книги PHP5 Дмитрия Котерова PHP: <?php ## Пример работы с TTF-шрифтом. require_once "lib/imagettf.php"; // Выводимая строка. // ВНИМАНИЕ! Для отображения русских букв необходимо их // передавать не в кодировке Windows, а в Unicode! $string = toUnicodeEntities("Привет, мир!"); // Шрифт. $font = getcwd()."/times.ttf"; // Загружаем фоновой рисунок. $im = imageCreateFromPng("sample02.png"); // Угол поворота зависит от текущего времени. $angle = (microtime(true)*10)%360; // Ксли хотите, чтобы текст шел из угла в угол, раскомментируйте строчку: # $angle = rad2deg(atan2(imageSY($im), imageSX($im))); // Подгоняем размер текста под размер изображения. $size = imageTtfGetMaxSize( $angle, $font, $string, imageSX($im), imageSY($im) ); // Создаем в палитре новые цвета $shadow = imageColorAllocate($im, 0, 0, 0); $color = imageColorAllocate($im, 128, 255, 0); // Вычисляем координаты вывода, чтобы текст оказался в центре. $sz = imageTtfSize($size, $angle, $font, $string); $x = (imageSX($im) - $sz[0]) / 2 + $sz[2]; $y = (imageSY($im) - $sz[1]) / 2 + $sz[3]; // Рисуем строку текста, вначале черным со сдвигом, а затем - // основным цветом поверх (чтобы создать эффект тени). imageTtfText($im, $size, $angle, $x+3, $y+2, $shadow, $font, $string); imageTtfText($im, $size, $angle, $x, $y, $color, $font, $string); // Сообщаем о том, что далее следует рисунок PNG. Header("Content-type: image/png"); // Выводим рисунок imagePng($im); ?> lib/imagettf.php PHP: <?php ## Библиотека полезных функций для работы с TTF. // Исправленная функция imageTtfBBox(). Работает корректно // даже при ненулевом угле поворота $angle (исходная функция // при этом работает неверно). function imageTtfBBox_fixed($size, $angle, $fontfile, $text) { // Вычисляем размер при НУЛЕВОМ угле поворота. $horiz = imageTtfBBox($size, 0, $fontfile, $text); // Вычисляим синус и косинус угла поворота. $cos = cos(deg2rad($angle)); $sin = sin(deg2rad($angle)); $box = array(); // Выполняем поворот каждой координаты. for ($i=0; $i<7; $i+=2) { list ($x, $y) = array($horiz[$i], $horiz[$i+1]); $box[$i] = round($x * $cos + $y * $sin); $box[$i+1] = round($y * $cos - $x * $sin); } return $box; } // Вычисляет размеры прямоугольника с горизонтальными и вертикальными // сторонами, в который вписан указанный текст. Результирующий массив // имеет структуру: // array( // 0 => ширина прямоугольника, // 1 => высота прямоугольника, // 2 => смещение начальной точки по X относительно левого верхнего // угла прямоугольника, // 3 => смещение начальной точки по Y // ) function imageTtfSize($size, $angle, $fontfile, $text) { // Вычисляем охкатывающий многоугольник. $box = imageTtfBBox_fixed($size, $angle, $fontfile, $text); $x = array($box[0], $box[2], $box[4], $box[6]); $y = array($box[1], $box[3], $box[5], $box[7]); // Вычисляем ширину, высоту и смещение начальной точки. $width = max($x)-min($x); $height = max($y)-min($y); return array($width, $height, 0-min($x), 0-min($y)); } // Функция возвращает наибольший размер шрифта, учитывая, что // текст $text обязательно должен поместиться в прямоугольник // размерами ($width, $height). function imageTtfGetMaxSize($angle, $fontfile, $text, $width, $height) { $min = 1; $max = $height; while (true) { // Рабочий размер - среднее между максимумом и минимумом. $size = round(($max + $min) / 2); $sz = imageTtfSize($size, $angle, $fontfile, $text); if ($sz[0] > $width || $sz[1] > $height) { // Будем уменьшать максимальную ширину до те пор, пока текст не // "перехлестнет" многоугольник. $max = $size; } else { // Наоборот, будем увеличивать минимальную, пока текст помещается. $min = $size; } // Минимум и максимум сошлись друг к другу. if (abs($max-$min) < 2) break; } return $min; } // Функция преобразует текст из кодировки iso8859-5 в Unicode-entities. // Ее необходимо вызывать перед запуском imageTtfText(), чтобы корректно // отображать русские буквы. Аргумент $from задает исходную кодировку // страницы (см. convert_cyr_string() для описания значений параметра). function toUnicodeEntities($text, $from="w") { $text = convert_cyr_string($text, $from, "i"); $uni = ""; for ($i=0, $len=strlen($text); $i<$len; $i++) { $char = $text{$i}; $code = ord($char); $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char; } return $uni; } ?>
Серьёзнее некуда... На основании: Вам предупреждение за разноцветные буквы и злоупотребление жирным шрифтом. Два поста подряд оформлены нестандартно, предполагаю, что и дальше вы делали бы тоже самое.
Ну тогда сори.. А проблемка то еще осталась... Вот новый скрипт на основе подсказки: PHP: <?php header("Content-type: image/png"); $db_connect = mysql_connect("localhost", "root"); mysql_select_db("db", $db_connect); $ans=mysql_query("SELECT Text from tips", $db_connect); $cntrows = mysql_num_rows($ans); mysql_data_seek ($ans, rand(0, $cntrows-1)); $row = mysql_fetch_row($ans); $row = toUnicodeEntities($row); $font = "arial.ttf"; $im = @imagecreate(100, 50); $background_color = imagecolorallocate($im, 255, 255, 255); $text_color = imagecolorallocate($im, 0, 0, 200); imagettftext($im, 20, 0, 10, 20, $text_color, $font, $row); imagepng($im); imagedestroy($im); function toUnicodeEntities($text, $from="w") { $text = convert_cyr_string($text, $from, "i"); $uni = ""; for ($i=0, $len=strlen($text); $i<$len; $i++) { $char = $text{$i}; $code = ord($char); $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char; } return $uni; } ?> Отображаются знаки - ?????? ???? ????. Но если текст добавлять не из базы, а непосредственно из скрипта, то отображение нормальное: PHP: <?php $row = "Мой текст."; $row = toUnicodeEntities($row); $font = "arial.ttf"; $im = @imagecreate(100, 50); $background_color = imagecolorallocate($im, 255, 255, 255); $text_color = imagecolorallocate($im, 0, 0, 200); imagettftext($im, 20, 0, 10, 20, $text_color, $font, $row); imagepng($im); imagedestroy($im); function toUnicodeEntities($text, $from="w") { $text = convert_cyr_string($text, $from, "i"); $uni = ""; for ($i=0, $len=strlen($text); $i<$len; $i++) { $char = $text{$i}; $code = ord($char); $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char; } return $uni; } ?>
Во! Тоже столкнулся с этой проблемой, что русские символы выглядят кракозябрами, если пытаться их нарисовать. Плохо понимаю о кодировках (надо будет как-нибудь на досуге разобраться), но интересно, а почему просто функция $text = utf8_encode($text); не помогает исправить ситуацию? А за функцию toUnicodeEntities($text, $from="w") спасибо, конечно! В моих учебниках по PHP, к сожалению, не рассматриваются вопросы генерации русских текстов на картинках, только английские...