Создание и возврат изображения в Silverstripe Framework

Я пытаюсь сгенерировать и вернуть изображение в шаблон с помощью Silverstripe 3.0 Framework, и у меня возникают некоторые проблемы.

Я возвращаю это в браузер в такой переменной:

public function make_image(){

    $string = 'string';
    $im     = imagecreate(300,300);
    $orange = imagecolorallocate($im, 220, 210, 60);
    $px     = (imagesx($im) - 7.5 * strlen($string)) / 2;
    imagestring($im, 3, $px, 9, $string, $orange);
    imagepng($im);
    imagedestroy($im);

}

Браузер отображает это как: �PNG IHDR,,C�6PLTE��<��*�"IDATh���1 �Om ?�x-��{�IEND�B`�

Возвращаемые заголовки являются текстовыми/html, и есть только один запрос, который заставляет меня думать, что там происходит что-то странное. Может ли кто-нибудь помочь мне с этим.

Возможно, другой способ добиться этого — Silverstripe с использованием класса Image ()?


person Daniel Tate    schedule 24.03.2013    source источник
comment
Попробуйте header("Content-type: image/png");   -  person    schedule 25.03.2013
comment
У меня заголовки в Silverstripe устанавливаются до рендеринга шаблона.   -  person Daniel Tate    schedule 25.03.2013
comment
<img src="my_image.png" type="image/png" /> Информации по этому поводу не так много, но не помешает попытаться заставить изображение отображаться правильно на выходе. Вы сначала записываете файл на сервер или сразу кладете его на страницу? Если я сделаю это в своем терминале; file -b my_png_file.png выводит; PNG image data, 1920 x 1080, 8-bit/color RGB, non-interlaced. Поскольку вы используете CMS, возможно, ваши заголовки уже отправлены. Попробуйте включить error_reporting('E_ALL'); и посмотрите, так ли это. Очень распространенная проблема. Вы можете использовать заголовки изображений только тогда, когда вы получаете PHP как изображение.   -  person    schedule 25.03.2013
comment
Под этим я подразумеваю, что заголовок сделает всю PHP-страницу отображаемой как таковую. Поэтому, если вы сделаете header("Content-type: image/png");, вы сможете вернуть только изображение, а не дополнительный контент. Что-то вроде этого будет результатом; <img src="my_image.php" />.   -  person    schedule 25.03.2013
comment
@Allendar Allendar Я пытаюсь вывести его прямо на страницу, но не уверен, что это правильный способ. Я собираюсь проверить то, что вы предложили, и ответ ниже.   -  person Daniel Tate    schedule 25.03.2013
comment
Дэниел Тейт: поскольку решение, опубликованное @jfbarrois ниже, похоже, решает вашу проблему, отметьте его как принятое. показывает вашу признательность, помогает найти нерешенные вопросы Silverstripe.   -  person schellmax    schedule 25.03.2013


Ответы (1)


Я не слишком уверен, зачем вам нужно играть с вашими http-заголовками. Я понимаю, что вы выполняете промежуточные шаги для создания своего изображения, поэтому вам нужно увидеть, как оно создается, но если ваша первоначальная цель — создать изображение, чтобы включить его в шаблон, это может помочь:

public function StringImage($string) {
    $filePath = ASSETS_PATH.'/'.$string.'.png';
    if (!file_exists(ASSETS_PATH.'/'.$string.'.png')){
        $stringFontSize = 11;
        $dimensions = imagettfbbox($stringFontSize, 90, 'Arial', $string);
        $gd = new GD();
        $width = $dimensions[2] - $dimensions[4];
        $height = $dimensions[7] - $dimensions[5];
        $image = imagecreatetruecolor($width, $height);
        imagefilledrectangle($image, 0, 0, $width, $height, 0xFFFFFF);
        imagettftext($image, $stringFontSize, 90, $width, $height, 0x000000, 'Arial', $string);
        $gd->setGD($image);
        $gd->writeTo($filePath);
    }
    return '<img src="'.ASSETS_DIR.'/'.$string.'.png'.'" alt="string"/>';
}
person jfbarrois    schedule 24.03.2013
comment
Прохладный. Для тех, кто хочет использовать приведенный выше код, возможно, стоит отметить, что переменная $string должна быть каким-то образом очищена перед использованием в качестве имени файла. Это было просто доказательство концепции. - person jfbarrois; 25.03.2013
comment
@DanielTate Если ответ сработал идеально, вы должны его принять. - person drzax; 26.03.2013