{"id":28017,"date":"2022-07-18T06:40:18","date_gmt":"2022-07-18T06:40:18","guid":{"rendered":"http:\/\/creating-a-virtual-photo-booth-gallery"},"modified":"2025-03-30T02:03:53","modified_gmt":"2025-03-30T09:03:53","slug":"creating-a-virtual-photo-booth-gallery","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/","title":{"rendered":"Creating a Virtual Photo Booth Gallery"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><h2>Introduction<\/h2>\n<p>Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.<\/p>\n<h2>PHPSandbox and Github<\/h2>\n<p>All the code is available on <a href=\"https:\/\/github.com\/musebe\/laravel-cloudinary-photobooth\">Github<\/a> and <a href=\"https:\/\/phpsandbox.io\/e\/x\/09rrc?layout=EditorPreview&amp;defaultPath=%2F&amp;theme=dark&amp;showExplorer=no&amp;openedFiles=\">PHPSandbox<\/a> for a live demonstration of the Virtual Photo Booth Gallery.<\/p>\n<h2>Prerequisites<\/h2>\n<p>To be able to follow this article, you need to have experience issuing commands through a terminal. You should also have some knowledge of Git version control and PHP specifically with the Laravel framework.<\/p>\n<h2>Getting Started<\/h2>\n<p>We will need Composer to initiate a Laravel project and install our dependencies. Follow the steps below diligently. In step 1 we will install PHP and Composer.<\/p>\n<ol>\n<li>\n<p>Install <a href=\"https:\/\/getcomposer.org\/\">Composer<\/a> and <a href=\"https:\/\/www.php.net\/manual\/en\/install.php\">PHP<\/a> on\nyour machine. Be sure to follow the steps for your respective operating system.<\/p>\n<\/li>\n<li>\n<p>There are two ways to install Laravel:<\/p>\n<ol>\n<li>\n<p>Via Composer:<\/p>\n<p><code>composer create-project --prefer-dist laravel\/laravel cloudinary-photobooth<\/code><\/p>\n<\/li>\n<li>\n<p>Via Laravel Installer (Recommended):<\/p>\n<p><code>composer global require laravel\/installer<\/code><\/p>\n<p><code>laravel new cloudinary-photobooth<\/code><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>Following the Laravel installation steps above will create a new application in the folder <code>cloudinary-photobooth<\/code>. Now we need to start the server and test our new application to ensure everything is okay. Change the directory to the project folder and run the local development server by typing the following commands:<\/p>\n<p><code>cd cloudinary-photobooth<\/code><\/p>\n<p><code>php artisan serve<\/code><\/p>\n<\/li>\n<\/ol>\n<p>The Laravel server should be up and running and when you open <code>http:\/\/localhost:8000<\/code> on your computer, you should see the application default page shown in the image below:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1655887283\/watermark-api\/assets\/laravel-running_zqk8ol.png\" alt=\"Laravel Server Running\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1239\" height=\"638\"\/><\/p>\n<h2>Setting up Cloudinary\u2019s Laravel SDK<\/h2>\n<p>Cloudinary has made integration easy for different programming languages with their Programmable Media SDK libraries and with a vibrant community, there are community libraries available as well. In this article, we will use Cloudinary\u2019s Laravel SDK.<\/p>\n<ol>\n<li>\n<p>First things first, we will need a Cloudinary account. You can sign up for one <a href=\"https:\/\/cloudinary.com\">here<\/a>. Don\u2019t worry it\u2019s free. Log in with your details and you will be redirected to the Dashboard. Take note of your Account details, the  Cloud Name, API Key, API Secret and the API Environment variable, we will need them later.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1655976836\/assets\/cloudinary_dashboard.png\" alt=\"Cloudinary Dashboard\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"940\" height=\"441\"\/><\/p>\n<\/li>\n<li>\n<p>Back at our terminal, we need to install <a href=\"https:\/\/github.com\/cloudinary-labs\/cloudinary-laravel#installation\">Cloudinary\u2019s Laravel SDK<\/a>. Run the following command:<\/p>\n<p><code>composer require cloudinary-labs\/cloudinary-laravel<\/code><\/p>\n<p><strong>Note<\/strong>: Follow the link to the SDK and ensure you follow all the steps in the #Installation section.<\/p>\n<\/li>\n<li>\n<p>To complete the setup we will need to add the Account details to our <code>.env<\/code> file as shown below:<\/p>\n<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\"><code>CLOUDINARY_API_KEY=YOUR_CLOUDINARY_API_KEY\nCLOUDINARY_API_SECRET=YOUR_CLOUDINARY_API_SECRET\nCLOUDINARY_CLOUD_NAME=YOUR_CLOUDINARY_CLOUD_NAME\nCLOUDINARY_URL=YOUR_CLOUDINARY_ENVIRONMENT_VARIABLE\n<\/code><\/pre>\n<h2>Image Manipulation<\/h2>\n<p>Cloudinary is a great platform for media management and manipulation. It is perfect for our current use case since we will need to apply some transformations to the images our users will be uploading and return a URL that we will use to populate our gallery.<\/p>\n<p>To return their desired photo booth effect we will manipulate the photos as follows:<\/p>\n<ol>\n<li>Change the aspect ratio 0.75 which is a 3&#215;4.<\/li>\n<li>Adjust the height to 1600px<\/li>\n<li>Apply an overlay of the respective effect chosen by the user<\/li>\n<\/ol>\n<p>Before we can start image manipulation, you\u2019ll have to upload the overlay effects to your Cloudinary media library. You can find them below:<\/p>\n<ol>\n<li>\n<a href=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/v1657605042\/photo-booth\/assets\/effect_one.png\">Cloudinary Rocks<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/v1657605044\/photo-booth\/assets\/effect_two.png\">Rose Flowers<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/v1657605043\/photo-booth\/assets\/effect_three.png\">Abstract<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/v1657605043\/photo-booth\/assets\/effect_four.png\">Flower Petals Effect<\/a>\n<\/li>\n<\/ol>\n<p>As you can see we will have four overlays in this project. You can download the above overlay effects and upload them to your Cloudinary Media library and name them as follows:<\/p>\n<ol>\n<li>\n<code>effect_one<\/code>\n<\/li>\n<li>\n<code>effect_two<\/code>\n<\/li>\n<li>\n<code>effect_three<\/code>\n<\/li>\n<li>\n<code>effect_four<\/code>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_scale,w_940\/c_limit,w_2000\/f_auto\/q_auto\/v1657624036\/photo-booth\/assets\/rename.png\" alt=\"Rename Overlay Effect\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"940\" height=\"468\"\/><\/p>\n<h2>Uploading the Photos<\/h2>\n<p>With the overlay effects uploaded, we will need a user interface to allow the user to upload images, for this, we will use the Laravel package Livewire.<\/p>\n<ol>\n<li>\n<p>Install Livewire Package by running the following command in your Laravel project:<\/p>\n<p><code>composer require livewire\/livewire<\/code><\/p>\n<\/li>\n<li>\n<p>Include Livewire scripts and styles on every page that will be using Livewire. In our case <code>welcome.blade.php<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">...\n    @livewireStyles\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    ...\n  \n    @livewireScripts\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ol start=\"3\">\n<li>\n<p>We will then create a Livewire Component to handle our image uploads:<\/p>\n<p><code>php artisan make:livewire PhotoBooth<\/code><\/p>\n<p>This will create two files, first <code>app\/Http\/Livewire\/PhotoBooth.php<\/code> and the other one\nin <code>resources\/views\/livewire\/photo-booth.blade.php<\/code>.<\/p>\n<p>We can then use this component anywhere in our code using the following snippet:<\/p>\n<p><code>&lt;livewire:photo-booth\/&gt;<\/code><\/p>\n<p>or<\/p>\n<p><code>@livewire('photo-booth')<\/code><\/p>\n<\/li>\n<li>\n<p>Open <code>resources\/views\/welcome.blade.php<\/code> and add the following code within the <code>&lt;body&gt;&lt;\/body&gt;<\/code> tags as shown below:<\/p>\n<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"antialiased\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    @livewire('photo-booth')\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This includes the Livewire component we created earlier in our <code>welcome.blade.php<\/code>.<\/p>\n<p><strong>Note:<\/strong> Please ensure you go through the <a href=\"https:\/\/laravel-livewire.com\/docs\/2.x\/quickstart\">Livewire documentation<\/a>, to learn how to install and set it up.<\/p>\n<ol start=\"3\">\n<li>Open the file <code>resources\/views\/livewire\/photo-booth.blade.php<\/code> and populate it with the following code:<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">&lt;form <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span>=<span class=\"hljs-string\">\"mb-5\"<\/span> wire:submit.prevent=<span class=\"hljs-string\">\"photoBooth\"<\/span>&gt;\n\t<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"form-group row mt-5 mb-3\"<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"input-group mb-5\"<\/span>&gt;<\/span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">select<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"effect\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"form-select @error('effect') is-invalid @enderror\"<\/span>\n\t\t\t        <span class=\"hljs-attr\">wire:model<\/span>=<span class=\"hljs-string\">\"effect\"<\/span>&gt;<\/span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">selected<\/span>&gt;<\/span>Choose Photo Effect ...<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">selected<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"effect_one\"<\/span>&gt;<\/span>Cloudinary Rocks<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"effect_two\"<\/span>&gt;<\/span>Rose Flower<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"effect_three\"<\/span>&gt;<\/span>Abstract<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"effect_four\"<\/span>&gt;<\/span>Flower Petals<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\t\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">select<\/span>&gt;<\/span>\n\t\t\t@error('effect')\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"invalid-feedback\"<\/span>&gt;<\/span>{{ $message }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\t\t\t@enderror\n\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"input-group\"<\/span>&gt;<\/span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"photo\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"form-control @error('photo') is-invalid @enderror\"<\/span>\n\t\t\t       <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Choose photo...\"<\/span> <span class=\"hljs-attr\">wire:model<\/span>=<span class=\"hljs-string\">\"photo\"<\/span>&gt;<\/span>\n\t\t\n\t\t\t@error('photo')\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"invalid-feedback\"<\/span>&gt;<\/span>{{ $message }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\t\t\t@enderror\n\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">small<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-muted text-center mt-2\"<\/span> <span class=\"hljs-attr\">wire:loading<\/span> <span class=\"hljs-attr\">wire:target<\/span>=<span class=\"hljs-string\">\"photo\"<\/span>&gt;<\/span>\n\t\t\t{{ __('Uploading') }}\u2026\n\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">small<\/span>&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-center\"<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"btn btn-sm btn-primary w-25\"<\/span>&gt;<\/span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"fas fa-check mr-1\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span> {{ __('Lights, Camera, Action') }}\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"spinner-border spinner-border-sm ml-1 mt-1\"<\/span> <span class=\"hljs-attr\">wire:loading<\/span> <span class=\"hljs-attr\">wire:target<\/span>=<span class=\"hljs-string\">\"photoBooth\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This is a form with a select field, file input field and a button. You can refer to the code on Github for the full implementation.<\/p>\n<h2>Implementation in Code<\/h2>\n<p>Open the file <code>app\/Http\/Livewire\/PhotoBooth.php<\/code> and update it with the following code:<\/p>\n<ol>\n<li>\n<p>First, we use Livewire\u2019s <code>WithFileUploads<\/code> to help us with file uploads, then create the variables <code>$photo<\/code>, <code>$effect<\/code>, <code>effectTransformations<\/code>, <code>$tag<\/code>, <code>$folder<\/code> and <code>$gallery<\/code> an array which will contain the transformed image URLs we get back from Cloudinary.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">WithFileUploads<\/span>;  \n\n<span class=\"hljs-keyword\">public<\/span> $photo;\n<span class=\"hljs-keyword\">public<\/span> $effect;\n<span class=\"hljs-keyword\">public<\/span> $gallery = &#91;];\n<span class=\"hljs-keyword\">public<\/span> $effectTransformations;\n<span class=\"hljs-keyword\">public<\/span> $folder = <span class=\"hljs-string\">\"photo-booth\"<\/span>;\n<span class=\"hljs-keyword\">public<\/span> $tag = <span class=\"hljs-string\">\"photo-booth\"<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<\/li>\n<li>\n<p>Next, create the <code>photoBooth<\/code> function which will apply upload and apply transformations to create the respective effect.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">photoBooth<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n ...\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<\/li>\n<li>\n<p>Let\u2019s populate our method in step 2 above:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">photoBooth<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n     <span class=\"hljs-keyword\">$this<\/span>-&gt;validate(&#91;\n       <span class=\"hljs-string\">'effect'<\/span> =&gt; <span class=\"hljs-string\">'required|string'<\/span>,\n       <span class=\"hljs-string\">'photo'<\/span> =&gt; &#91;<span class=\"hljs-string\">'required'<\/span>, <span class=\"hljs-string\">'image'<\/span>, <span class=\"hljs-string\">'max:10240'<\/span>\n     ]);\n\n     $photo = cloudinary()-&gt;upload(<span class=\"hljs-keyword\">$this<\/span>-&gt;photo-&gt;getRealPath(), &#91;\n         <span class=\"hljs-string\">'folder'<\/span> =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;folder,\n         <span class=\"hljs-string\">'aspect_ratio'<\/span>   =&gt; <span class=\"hljs-number\">0.75<\/span>,\n         <span class=\"hljs-string\">'crop'<\/span>           =&gt; <span class=\"hljs-string\">'fill'<\/span>,\n         <span class=\"hljs-string\">'height'<\/span>         =&gt; <span class=\"hljs-number\">1600<\/span>,\n         <span class=\"hljs-string\">'gravity'<\/span> =&gt; <span class=\"hljs-string\">'faces'<\/span>\n     ])-&gt;getSecurePath();\n\n    <span class=\"hljs-keyword\">$this<\/span>-&gt;effectTransformations = &#91;\n       <span class=\"hljs-string\">'overlay'<\/span> =&gt; &#91;\n           <span class=\"hljs-string\">'public_id'<\/span> =&gt; <span class=\"hljs-string\">\"$this-&gt;folder\/assets\/$this-&gt;effect\"<\/span>,\n           <span class=\"hljs-string\">'flags'<\/span>     =&gt; <span class=\"hljs-string\">'layer_apply'<\/span>,\n           <span class=\"hljs-string\">'width'<\/span>     =&gt; <span class=\"hljs-number\">1.0<\/span>,\n           <span class=\"hljs-string\">'height'<\/span>    =&gt; <span class=\"hljs-number\">1.0<\/span>,\n       ]\n    ];\n\n    $transformed = cloudinary()-&gt;upload($photo, &#91;\n       <span class=\"hljs-string\">'folder'<\/span> =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;folder,\n       <span class=\"hljs-string\">'tags'<\/span>   =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;tag,\n       <span class=\"hljs-string\">'transformation'<\/span> =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;effectTransformations\n    ])-&gt;getSecurePath();\n\n    <span class=\"hljs-keyword\">$this<\/span>-&gt;gallery = Arr::prepend(<span class=\"hljs-keyword\">$this<\/span>-&gt;gallery, $transformed);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Let\u2019s talk about the code.<\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<h3>Overlay Transformation<\/h3>\n<p>First, we create the effect transformations based on user input and assign them to the variable <code>$effectTransformations<\/code>.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">$this<\/span>-&gt;effectTransformations = &#91;\n  &#91;<span class=\"hljs-string\">'crop'<\/span> =&gt; <span class=\"hljs-string\">'crop'<\/span>, <span class=\"hljs-string\">'aspect_ratio'<\/span> =&gt; <span class=\"hljs-number\">0.75<\/span>, <span class=\"hljs-string\">'gravity'<\/span> =&gt; <span class=\"hljs-string\">'faces'<\/span>, <span class=\"hljs-string\">'height'<\/span> =&gt; <span class=\"hljs-number\">1600<\/span>],\n  &#91;\n     <span class=\"hljs-string\">'overlay'<\/span> =&gt; &#91;\n       <span class=\"hljs-string\">'public_id'<\/span> =&gt; <span class=\"hljs-string\">\"$this-&gt;folder\/assets\/$this-&gt;effect\"<\/span>,\n       <span class=\"hljs-string\">'flags'<\/span>     =&gt; <span class=\"hljs-string\">'layer_apply'<\/span>,\n       <span class=\"hljs-string\">'width'<\/span>     =&gt; <span class=\"hljs-number\">1.0<\/span>,\n       <span class=\"hljs-string\">'height'<\/span>    =&gt; <span class=\"hljs-number\">1.0<\/span>,\n     ]\n  ]\n ];\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ul>\n<li>\n<h3>Upload Photo with Transformations<\/h3>\nFirst, we upload the user image to Cloudinary, with an <code>aspect_ratio<\/code> of <code>0.75<\/code>, <code>crop<\/code> of <code>fill<\/code>, <code>gravity<\/code> set to <code>faces<\/code> and get the <code>secure_url<\/code> which we save in the variable <code>$photo<\/code>. The last line just prepends the transformed <code>$photo<\/code> to our <code>$this-&gt;gallery<\/code> array which we use to display the gallery.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">$photo = cloudinary()-&gt;upload(<span class=\"hljs-keyword\">$this<\/span>-&gt;photo-&gt;getRealPath(), &#91;\n\t<span class=\"hljs-string\">'folder'<\/span>         =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;folder, \n\t<span class=\"hljs-string\">'tags'<\/span>           =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;tag,\n\t<span class=\"hljs-string\">'transformation'<\/span> =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;effectTransformations\n])-&gt;getSecurePath();\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;gallery = Arr::prepend(<span class=\"hljs-keyword\">$this<\/span>-&gt;gallery, $photo);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Update our Livewire component view and add the following code beneath the form:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"row mt-4\"<\/span>&gt;<\/span>\n\t@foreach($this-&gt;gallery as $galleryItem)\n\t\t@if ($galleryItem)\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"col-sm-3 col-md-3 mb-3\"<\/span>&gt;<\/span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"card-img-top img-thumbnail img-fluid\"<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"{{ $galleryItem }}\"<\/span> <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Virtual Photo Booth\"<\/span>\/&gt;<\/span>\n\t\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\t\t@endif\n\t@endforeach\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This will display our gallery.<\/p>\n<p>With our code implementation complete, you should be able to see the following when you navigate to <code>http:\/\/localhost:8000<\/code>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_scale,w_940\/c_limit,w_2000\/f_auto\/q_auto\/v1657629350\/photo-booth\/assets\/demo_ha4bgw.png\" alt=\"Cloudinary Virtual Photo Booth Demo\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"940\" height=\"770\"\/><\/p>\n<h2>Awesome<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_scale,w_400\/c_limit,w_2000\/f_auto\/q_auto\/v1657629099\/photo-booth\/Xl3XxUTaukus92joF0MbF1HghboMZj-metaYmxhY2stbWFuLWhlcm8tYW5ncnktZXhwcmVzc2lvbi5qcGc_-_odrbyg.jpg\" alt=\"Cloudinary Virtual Photo\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"400\" height=\"533\"\/><\/p>\n<p>Congratulations, we have built our own virtual photo booth powered by Cloudinary and Laravel. This is just the beginning, with Cloudinary you can create wonderful image management and manipulation products.<\/p>\n<p>Keep discovering more with Cloudinary, all you have to do is create a <a href=\"https:\/\/cloudinary.com\/signup\">free<\/a> account.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":28018,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,387,229,371],"class_list":["post-28017","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-laravel","tag-php","tag-under-review"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Creating a Virtual Photo Booth Gallery<\/title>\n<meta name=\"description\" content=\"Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating a Virtual Photo Booth Gallery\" \/>\n<meta property=\"og:description\" content=\"Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-18T06:40:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-30T09:03:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"612\" \/>\n\t<meta property=\"og:image:height\" content=\"459\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Creating a Virtual Photo Booth Gallery\",\"datePublished\":\"2022-07-18T06:40:18+00:00\",\"dateModified\":\"2025-03-30T09:03:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA\",\"keywords\":[\"Guest Post\",\"Laravel\",\"PHP\",\"Under Review\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\",\"name\":\"Creating a Virtual Photo Booth Gallery\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA\",\"datePublished\":\"2022-07-18T06:40:18+00:00\",\"dateModified\":\"2025-03-30T09:03:53+00:00\",\"description\":\"Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA\",\"width\":612,\"height\":459},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Creating a Virtual Photo Booth Gallery\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Creating a Virtual Photo Booth Gallery","description":"Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/","og_locale":"en_US","og_type":"article","og_title":"Creating a Virtual Photo Booth Gallery","og_description":"Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-07-18T06:40:18+00:00","article_modified_time":"2025-03-30T09:03:53+00:00","og_image":[{"width":612,"height":459,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/"},"author":{"name":"","@id":""},"headline":"Creating a Virtual Photo Booth Gallery","datePublished":"2022-07-18T06:40:18+00:00","dateModified":"2025-03-30T09:03:53+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA","keywords":["Guest Post","Laravel","PHP","Under Review"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/","name":"Creating a Virtual Photo Booth Gallery","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA","datePublished":"2022-07-18T06:40:18+00:00","dateModified":"2025-03-30T09:03:53+00:00","description":"Physical events are often packed with several brand activation activities and photo booths are always a must. We can make our space exciting and engaging to our audience by creating a photo booth. The virtual photo booth will take user images apply cool effect transformations and display them in a gallery.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA","width":612,"height":459},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/creating-a-virtual-photo-booth-gallery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Creating a Virtual Photo Booth Gallery"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925659\/Web_Assets\/blog\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8\/704fea2137aba13f0eca05f4718f984027b85334-612x459-1_28018f39d8.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=28017"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28017\/revisions"}],"predecessor-version":[{"id":37297,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28017\/revisions\/37297"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/28018"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28017"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}