PHP Classes

File: src/Customs/ImageOverlay.php

Recommend this page to a friend!
  Packages of Amirreza Ebrahimi   HeroQR Powerful PHP QR Code Library to generate PNG, SVG, PDF, Logos Ready to Use with Laravel   src/Customs/ImageOverlay.php   Download  
File: src/Customs/ImageOverlay.php
Role: Class source
Content type: text/plain
Description: Class source
Class: HeroQR Powerful PHP QR Code Library to generate PNG, SVG, PDF, Logos Ready to Use with Laravel
Generate QR code images in several formats
Author: By
Last change: Update of src/Customs/ImageOverlay.php
Date: 6 months ago
Size: 3,653 bytes
 

Contents

Class file image Download
<?php

namespace HeroQR\Customs;

/**
 * A class that overlays a background image with a custom cursor image, providing functionality
 * to save, display, or return the result as a base64 string.
 *
 * @package HeroQR\Customs
 */
class ImageOverlay
{
    private ?
string $backgroundPath;
    private ?
string $overlayPath;

   
/**
     * Constructor to initialize background and overlay paths
     */
   
public function __construct($background, $overlay)
    {
       
$this->overlayPath = CursorPaths::getValueByKey($overlay);
       
$this->backgroundPath = MarkerPaths::getValueByKey($background);
    }

   
/**
     * Validates the paths for background and overlay
     */
   
private function validatePaths(): void
   
{
        if (!
file_exists($this->backgroundPath) || !file_exists($this->overlayPath)) {
            throw new \
Exception('Invalid file paths for background or overlay images.');
        }
    }

   
/**
     * Creates an image resource from a file path
     */
   
private function createImageResource(string $path): \GdImage
   
{
       
$image = imagecreatefrompng($path);

        if (!
$image) {
            throw new \
Exception('Failed to create image resource.');
        }

        return
$image;
    }

   
/**
     * Creates a centered image by overlaying one image on another
     */
   
private function createCenteredImage(): \GdImage
   
{
       
$this->validatePaths();

       
$background = $this->createImageResource($this->backgroundPath);
       
$overlay = $this->createImageResource($this->overlayPath);

       
$bgWidth = imagesx($background);
       
$bgHeight = imagesy($background);
       
$overlayWidth = imagesx($overlay) / 3.1;
       
$overlayHeight = imagesy($overlay) / 3.1;

       
$x = ($bgWidth - $overlayWidth) / 2;
       
$y = ($bgHeight - $overlayHeight) / 2;

       
imagealphablending($background, true);
       
imagesavealpha($background, true);

       
imagecopyresampled(
           
$background,
           
$overlay,
            (int)
$x,
            (int)
$y,
           
0,
           
0,
            (int)
$overlayWidth,
            (int)
$overlayHeight,
           
imagesx($overlay),
           
imagesy($overlay)
        );

        return
$background;
    }

   
/**
     * Saves the generated image to the specified output path
     */
   
public function saveImage(string $outputPath): void
   
{
       
$result = $this->createCenteredImage();

       
imagepng($result, $outputPath);
       
imagedestroy($result);
    }

   
/**
     * Returns the image as a base64-encoded URI
     */
   
public function getUriImage(): string
   
{
        return
$this->getImageAsBase64();
    }

   
/**
     * Returns the image as a string
     */
   
public function getImageAsString(): string
   
{
        return
$this->getImageAsBase64(false);
    }

   
/**
     * Helper method to generate base64 image output
     */
   
private function getImageAsBase64(bool $uri = true): string
   
{
       
$image = $this->createCenteredImage();

       
ob_start();
       
imagepng($image);
       
$data = ob_get_clean();
       
imagedestroy($image);

        return
$uri ? 'data:image/png;base64,' . base64_encode($data) : $data;
    }

   
/**
     * Returns the generated image as a GdImage instance
     */
   
public function getImage(): \GdImage
   
{
        return
$this->createCenteredImage();
    }

   
/**
     * Outputs the image directly to the browser
     */
   
public function outputImage(): void
   
{
       
$result = $this->createCenteredImage();

       
header('Content-Type: image/png');
       
imagepng($result);
       
imagedestroy($result);
    }
}