Вывести во view динамически сформированное изображение

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
serg-tur
Сообщения: 10
Зарегистрирован: 2019.11.19, 20:04

Вывести во view динамически сформированное изображение

Сообщение serg-tur »

Добрый день, уважаемые форумчане!
В контроллере динамически формирую изображение. Задача состоит в том, чтобы вывести это изображение во view.
Сохранять это изображение в файл, чтобы затем вывести по ссылке во view не хочется, т.к. потом этот файл придется удалять.
В php делал так <img src="file.php">, где file.php формировал изображение.
Как это можно сделать в yii2? Буду рад любой информации или идее.

Yii2 только осваиваю, поэтому прошу не ругать за банальный вопрос.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Вывести во view динамически сформированное изображение

Сообщение unknownby »

У тебя есть контроллер, который получает модель, где генерируется изображение. Дальше через контроллер ты передаешь нужную информацию на просмотр.
Изобразим это таким образом

Код: Выделить всё

//отображение главной страницы
public function actionIndex()
    {
        $model = new Product;

        return $this->render('index', [
            'model' => $model,
	]);
    }
Дальше в просмотре создаем изображение и запихиваем в него нужные параметры, которые берутся из твоей модели. Ну и нужные CSS пропишешь, какие нужны лично под твою задачу.

Код: Выделить всё

<?= Html::img($model->product_image_url, ['alt' => $model->product_file_title, 'width' => '25%', 'style' =>['position' => 'absolute', 'right' => '0', 'top' => '0']]) ?>
В модели у меня присутствует формирование src

Код: Выделить всё

public function getproduct_image_url(){
        return $this->product_file_base_url . $this->product_file_path;
}
serg-tur
Сообщения: 10
Зарегистрирован: 2019.11.19, 20:04

Re: Вывести во view динамически сформированное изображение

Сообщение serg-tur »

Спасибо за подробный ответ, но это немного не то, что я хотел спросить.
Задача состоит в том, чтобы файл изображения, который сформирован динамически в модели или в контроллере вывести во вьюшке, т.е. файл изображения не сохранен и к нему нет пути.
Пример, есть файл file.php
<?php
$image = imageCreate(200, 50); //Создаем изображение
imagePNG($image); //Содаем png
return $image;
?>

На php выводится <img src="file.php">
КАК ТАКОЕ СДЕЛАТЬ В YII2?
Предположим модель возвращает $image. Как во вьюшке вывести это $image?
В Html::img(путь к файлу), а пути нет. есть само изображение.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Вывести во view динамически сформированное изображение

Сообщение yiiliveext »

Код: Выделить всё

public function actionGetImage() {
    \Yii::$app->response->format = yii\web\Response::FORMAT_RAW;
    \Yii::$app->response->headers->add('Content-Type', 'image/png');
    \Yii::$app->response->data = $this->getMyImageData(); //сформированное изображение
    
    return \Yii::$app->response;
}
В представлении в src указываете url этого action.
ddmitrenko
Сообщения: 82
Зарегистрирован: 2015.02.04, 16:31

Re: Вывести во view динамически сформированное изображение

Сообщение ddmitrenko »

Может вот это поможет -

Код: Выделить всё

[
    'attribute' => 'img1',
    'value' => 'data:image/jpeg;base64,' . $model->img1,
    'format' => ['image', ['width' => '100', 'height' => '100']]
],
В модели объявляете переменную img1 и в нее записываете изображение.
С уважением, Дмитрий.
serg-tur
Сообщения: 10
Зарегистрирован: 2019.11.19, 20:04

Re: Вывести во view динамически сформированное изображение

Сообщение serg-tur »

Спасибо, yiiliveext. То, что надо!
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Вывести во view динамически сформированное изображение

Сообщение proctoleha »

Хороший вопрос!
Как то я сам не додумался применить подобный принцип - отдавать не сохраненное изображение, а сгенерированную картинку. Щас решаю задачу - вывести произвольную надпись на картинке, согласно неким заданным условиям. Условия все пишутся в базу, и сохранять картинки с надписями смысла нет. Только лишний мусор.

Так что спасибо за тему.

У меня получилось так:
вьюха:

Код: Выделить всё

<?= Html::img($model->getWebPath(), ['class' => 'img-responsive']) ?>
модель:

Код: Выделить всё

    public function getWebPath()
    {
        if ($this->text) {
            $data = (new ImgTextService())->annotateImage(new DtoImg($this));
            $img = 'data:' . $data['format'] . ';base64,' . base64_encode($data['img']);
            return $img;
        }
        return self::PATH_TO_DIR . $this->path . '/' . $this->path . '.' . $this->ext;
    }
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Ответить