Как объединить несколько изображений с указанием размера и положения в одно изображение с текстовой надписью (API)

У меня есть три изображения с целью сделать первое изображение базовым, а два других изображения размещены на нем. При этом второе изображение размещено в левом углу (почти вверху), а третье изображение размещено почти в самом низу правого угла с текстовой надписью под ним.

Это приложение на основе API, я пишу в JSON (http://127.0.0.1:8000/api/upload)

Кроме того, я пытался использовать изображение вмешательства, но столкнулся с серьезной проблемой с ошибкой, связанной с ожидаемым массивом вместо строки, и, кроме того, вставка () жалуется на то, что столбец не найден. Вот почему я использовал сырой PHP.

Первое изображение должен закрывать черный фон

Как объединить несколько изображений с указанием размера и положения в одно изображение с текстовой надписью (API)

Второе изображение должен располагаться в правом (почти верхнем) углу

Как объединить несколько изображений с указанием размера и положения в одно изображение с текстовой надписью (API)

Ожидается, что Третье изображение будет помещен в левый нижний угол, а текст будет завернут под него.

мое изображение контроллера отображает изображение, разбросанное с текстом над изображением, а не под ним.

Как объединить несколько изображений с указанием размера и положения в одно изображение с текстовой надписью (API)

   public function upload(Request $request)
        {
            $x=$y=600;
                header('Content-Type: image/png');
                // $targetFolder = '/app/uploads/images/';
                // $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;

            $validation = $request->validate([
                        'title' => 'string',
                        'image' => 'required|file|image|mimes:jpeg,png,gif,webp|max:2048'
                    ]);

            $file      = $validation['image']; // get the validated file
            $extension = $file->getClientOriginalExtension();
            $filename  = 'mm-image-' . time() . '.' . $extension;
            $path      = $file->storeAs('/uploads/images', $filename);
            $image = storage_path('app/uploads/images/mm-image-1552822080.png');
            $c = storage_path('app/uploads/images/mm-image-1552936505.png');
            $im3 = file_get_contents($request->image);
            $outputImage = imagecreatetruecolor(600, 600);

            // set background to white
            $white = imagecolorallocate($outputImage, 255, 255, 255);
            imagefill($outputImage, 0, 0, $white);

                $first = imagecreatefrompng($image);
                $second = imagecreatefrompng($c);
                $third = imagecreatefromstring($im3);

                //imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
                imagecopyresized($outputImage,$first,0,0,0,0, $x, $y,$x,$y);
                imagecopyresized($outputImage,$second,0,0,0,0, $x, $y,$x,$y);
                imagecopyresized($outputImage,$third,300,300,0,0, 100, 100, $x, $y);

                // Add the text
                //imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
                //$white = imagecolorallocate($im, 255, 255, 255);
                $text = 'School Name Here';
                $font = storage_path('app/public/tahoma.ttf');
                imagettftext($outputImage, 16, 0, 300, 300, $white, $font, $text);

                $filename =storage_path('app/uploads/images/'.round(microtime(true)).'.png');
                imagepng($outputImage, $filename);

                imagedestroy($outputImage);
           }

Ожидаемый результатКак объединить несколько изображений с указанием размера и положения в одно изображение с текстовой надписью (API)

Ну, вы можете использовать div с фоновым изображением, соответствующим желтому. Затем внутри div вы можете расположить свои внутренние изображения с помощью flexbox.

Kenny Horna 19.03.2019 16:14

Извините, я не упомянул, это API. Пишу в JSON, уже создал конечную точку

Payne 19.03.2019 16:51

вы можете сделать это с помощью image.intervention.io сделать изображение с фоном вставить другие изображения с размером и положением xy местоположение

Gaurav Gupta 22.03.2019 06:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
677
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как сказал Гаурав Гупта в комментариях, я предлагаю вам использовать PHP-пакет Intervention Image, который инкапсулирует все методы GD во что-то простое в использовании (вы также можете использовать Imagick).

Вы можете сделать что-то вроде этого:

public function upload(Request $request)
{       
    $x=$y=600;
    $imageMerge = new ImageMerge();
    header('Content-Type: image/png');
    $validation = $request->validate([
        'title' => 'string',
        'image' => 'required|file|image|mimes:jpeg,png,gif,webp|max:2048'
    ]);
    $file      = $request->file('image')->getClientOriginalName();
    $extension = $request->file('image')->getClientOriginalExtension();
    $hash      = Str::random(10);
    $filename  = 'mm-image-' . $hash . '.' . $extension;
    $path      = $file->storeAs('/uploads/images', $filename, ['disk' => 'public']);
    $image     = storage_path('app/uploads/images/mm-image-1552822080.png');
    $c         = storage_path('app/uploads/images/mm-image-1552936505.png');
    $im3       = file_get_contents($request->title);

    $logo = Image::make($file);
    $background = Image::make($image);
    $person = Image::make($c);

    // Resize the picture to insert to the good size
    $logo->resize(200, 320);
    $person->resize(300, 200);

    // Insert those pictures in the background to a specific position with some padding
    $background->insert($person, 'left', 30, 0);
    $background->insert($logo, 'right', 30, 0);

    // Draw white filled rectangle for the text
    $background->rectangle(0, 0, 0, 0, function ($draw) {
        $draw->background('#FFFFFF');
    });

    // use callback to define details
    $background->text($im3, 0, 0, function($font) {
        $font->file(storage_path('app/public/tahoma.ttf'));
        $font->size(24);
        $font->color('#000000');
        $font->align('center');
    });

    // Resize image to specific output size
    $background->resize($x, $y);

    $exportName = 'file-'.$hash.'.'.$extension;
    Storage::disk('public')->put('/uploads/final/'.$exportName, $background);

    $imageMerge->image = $exportName;
    $imageMerge->save();
}

Это не готовый сценарий. Вам по-прежнему нужно рассчитать все точные позиции элементов и проверить все пути хранения, чтобы убедиться, что каждый файл импортирован правильно, но, в конце концов, Intervention Image действительно прост в использовании.

Вот методы, которые мы использовали в документации, чтобы вы могли настроить их под свои нужды:

Я также пытаюсь сохранить его в указанном месте, а также в базе данных

Payne 22.03.2019 14:42

Проверьте код еще раз, он должен был быть $background

dib258 22.03.2019 17:27

Хорошо, но текст отображается так же, как и фон, нарисованный белым прямоугольником. Я изменил его на $background

Payne 22.03.2019 18:07

Вы говорите, что текст имеет тот же цвет, что и фон? Чтобы сохранить изображение в хранилище и базе данных, вы должны сделать что-то вроде: Storage::disk('public')->put($filename, $background); и сохранить имя файла $ в базе данных, вы сможете получить его из yourwebsite.com/storage/mypicture.jpg, если вы сделали символическую ссылку на папку с помощью php artisan storage:link

dib258 22.03.2019 18:09

как сохранить в базу? Я сохранил в каталоге, используя public_path('/uploads/images/file'.$i.'.png')

Payne 22.03.2019 18:14

Вы не сохраняете изображение в базе данных, а только имя изображения, чтобы иметь возможность получить и создать URL-адрес. У вас есть база данных? Красноречивые модели?

dib258 22.03.2019 18:23

Да, я могу это сделать, но вставляется весь путь. Пожалуйста, проверьте код, который я редактировал. Имя пути — $saveme, и я сделал $imag->image = $saveme, но это все, что у меня есть. Как я могу сохранить имя файла вместо пути /Applications/XAMPP/xamppfiles/htdocs/flavourvotes/Server/pu‌​blic/uploads/images/‌​file3.png

Payne 22.03.2019 18:26

Я изменил ваше редактирование, чтобы показать, как использовать фасад хранилища и сохранить в вашей модели только имя изображения.

dib258 22.03.2019 18:38

Извините за беспокойство, размер текста не меняется. Я увеличил до 40, но настолько мал, что не читается, даже я увеличил до 100

Payne 22.03.2019 18:39

Я не знаю, может быть, попробовать другой шрифт или попробовать что-то огромное, например, 500.

dib258 22.03.2019 18:42

Это ошибка с измененным «Вызовом функции-члена getClientOriginalExtension() в строке»

Payne 22.03.2019 18:43

Также в тексте вы используете этот $im3 = file_get_contents($request->image);. Разве это не должно быть $request->title вместо этого?

dib258 22.03.2019 18:43

Вместо этого измените его на $extension = $request->file('image')->getClientOriginalExtension();.

dib258 22.03.2019 18:44

Странно, что предыдущая строка $file работает, а $extension нет. Вы также можете попробовать получить расширение с помощью следующего кода $extension = pathinfo($fileName, PATHINFO_EXTENSION);

dib258 23.03.2019 12:00

Я переписал код, но столкнулся только с чтением из базы данных.

Payne 24.03.2019 15:25

Другие вопросы по теме