У меня есть три изображения с целью сделать первое изображение базовым, а два других изображения размещены на нем. При этом второе изображение размещено в левом углу (почти вверху), а третье изображение размещено почти в самом низу правого угла с текстовой надписью под ним.
Это приложение на основе API, я пишу в JSON (http://127.0.0.1:8000/api/upload)
Кроме того, я пытался использовать изображение вмешательства, но столкнулся с серьезной проблемой с ошибкой, связанной с ожидаемым массивом вместо строки, и, кроме того, вставка () жалуется на то, что столбец не найден. Вот почему я использовал сырой PHP.
Первое изображение должен закрывать черный фон
Второе изображение должен располагаться в правом (почти верхнем) углу
Ожидается, что Третье изображение будет помещен в левый нижний угол, а текст будет завернут под него.
мое изображение контроллера отображает изображение, разбросанное с текстом над изображением, а не под ним.
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. Пишу в JSON, уже создал конечную точку
вы можете сделать это с помощью image.intervention.io сделать изображение с фоном вставить другие изображения с размером и положением xy местоположение






Как сказал Гаурав Гупта в комментариях, я предлагаю вам использовать 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 действительно прост в использовании.
Вот методы, которые мы использовали в документации, чтобы вы могли настроить их под свои нужды:
Я также пытаюсь сохранить его в указанном месте, а также в базе данных
Проверьте код еще раз, он должен был быть $background
Хорошо, но текст отображается так же, как и фон, нарисованный белым прямоугольником. Я изменил его на $background
Вы говорите, что текст имеет тот же цвет, что и фон? Чтобы сохранить изображение в хранилище и базе данных, вы должны сделать что-то вроде: Storage::disk('public')->put($filename, $background); и сохранить имя файла $ в базе данных, вы сможете получить его из yourwebsite.com/storage/mypicture.jpg, если вы сделали символическую ссылку на папку с помощью php artisan storage:link
как сохранить в базу? Я сохранил в каталоге, используя public_path('/uploads/images/file'.$i.'.png')
Вы не сохраняете изображение в базе данных, а только имя изображения, чтобы иметь возможность получить и создать URL-адрес. У вас есть база данных? Красноречивые модели?
Да, я могу это сделать, но вставляется весь путь. Пожалуйста, проверьте код, который я редактировал. Имя пути — $saveme, и я сделал $imag->image = $saveme, но это все, что у меня есть. Как я могу сохранить имя файла вместо пути /Applications/XAMPP/xamppfiles/htdocs/flavourvotes/Server/public/uploads/images/file3.png
Я изменил ваше редактирование, чтобы показать, как использовать фасад хранилища и сохранить в вашей модели только имя изображения.
Извините за беспокойство, размер текста не меняется. Я увеличил до 40, но настолько мал, что не читается, даже я увеличил до 100
Я не знаю, может быть, попробовать другой шрифт или попробовать что-то огромное, например, 500.
Это ошибка с измененным «Вызовом функции-члена getClientOriginalExtension() в строке»
Также в тексте вы используете этот $im3 = file_get_contents($request->image);. Разве это не должно быть $request->title вместо этого?
Вместо этого измените его на $extension = $request->file('image')->getClientOriginalExtension();.
Странно, что предыдущая строка $file работает, а $extension нет. Вы также можете попробовать получить расширение с помощью следующего кода $extension = pathinfo($fileName, PATHINFO_EXTENSION);
Я переписал код, но столкнулся только с чтением из базы данных.
Ну, вы можете использовать
divс фоновым изображением, соответствующим желтому. Затем внутри div вы можете расположить свои внутренние изображения с помощью flexbox.