PHP Classes

File: src/Managers/ColorManager.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/Managers/ColorManager.php   Download  
File: src/Managers/ColorManager.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: Fix alpha conversion for GD: map 0–255 hex alpha to 0–127
Date: 6 months ago
Size: 5,241 bytes
 

Contents

Class file image Download
<?php

declare(strict_types=1);

namespace
HeroQR\Managers;

use
Endroid\QrCode\Color\{Color, ColorInterface};
use
HeroQR\Contracts\Managers\ColorManagerInterface;

/**
 * Manages the foreground, background, and label colors for QR codes
 * Allows setting and getting colors in hexadecimal format and converts them to RGB or RGBA values
 * The class ensures proper handling of colors for the QR code, including support for alpha transparency
 *
 * @package HeroQR\Managers
 */
class ColorManager implements ColorManagerInterface
{
   
/**
     * ColorManager constructor
     *
     * Initializes default colors for the QR code: color (black), background (white), and label (black)
     *
     * @param ColorInterface $color Default color of the QR code (black)
     * @param ColorInterface $backgroundColor Default background color of the QR code (white)
     * @param ColorInterface $labelColor Default label color (black)
     */
   
public function __construct(
        private
ColorInterface $color = new Color(0, 0, 0, 0), # Default black
       
private ColorInterface $backgroundColor = new Color(255, 255, 255, 0), # Default white
       
private ColorInterface $labelColor = new Color(0, 0, 0, 0), # Default black
   
)
    {
    }

   
/**
     * Set the foreground color of the QR code
     *
     * Converts the provided hex color string to an RGB value and assigns it to the QR code's color property
     *
     * @param string $hexColor The hex color string ( #ff0000,'#ffffffFF')
     * @throws \InvalidArgumentException If the hex color format is invalid
     */
   
public function setColor(string $hexColor): void
   
{
        if (!
$this->isValidHexColor($hexColor)) {
            throw new \
InvalidArgumentException("Invalid hex foreground color format: {$hexColor}");
        }

       
$this->color = $this->hex2rgb($hexColor);
    }

   
/**
     * Get the foreground color of the QR code
     *
     * @return ColorInterface The current color of the QR code
     */
   
public function getColor(): ColorInterface
   
{
        return
$this->color;
    }

   
/**
     * Set the background color of the QR code
     *
     * Converts the provided hex color string to an RGB value and assigns it to the QR code's background color property
     *
     * @param string $hexColor The hex color string ( #ffffff,#ffffffFF)
     * @throws \InvalidArgumentException If the hex color format is invalid
     */
   
public function setBackgroundColor(string $hexColor): void
   
{
        if (!
$this->isValidHexColor($hexColor)) {
            throw new \
InvalidArgumentException("Invalid hex background color format: {$hexColor}");
        }

       
$this->backgroundColor = $this->hex2rgb($hexColor);
    }

   
/**
     * Get the background color of the QR code
     *
     * @return ColorInterface The current background color of the QR code
     */
   
public function getBackgroundColor(): ColorInterface
   
{
        return
$this->backgroundColor;
    }

   
/**
     * Set the label color of the QR code
     *
     * Converts the provided hex color string to an RGB value and assigns it to the QR code's label color property
     *
     * @param string $hexColor The hex color string ( #000000)
     * @throws \InvalidArgumentException If the hex color format is invalid
     */
   
public function setLabelColor(string $hexColor): void
   
{
        if (!
$this->isValidHexColor($hexColor)) {
            throw new \
InvalidArgumentException("Invalid hex label color format: {$hexColor}");
        }

       
$this->labelColor = $this->hex2rgb($hexColor);
    }

   
/**
     * Get the label color of the QR code
     *
     * @return ColorInterface The current label color of the QR code
     */
   
public function getLabelColor(): ColorInterface
   
{
        return
$this->labelColor;
    }

   
/**
     * Helper method to validate if a hex color is valid
     *
     * @param string $hexColor The color code to validate
     * @return bool True if the color code is valid, false otherwise
     */
   
private function isValidHexColor(string $hexColor): bool
   
{
        return
preg_match('/^#([a-fA-F0-9]{3}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/', $hexColor) === 1;
    }

   
/**
     * Convert a hex color string to RGB format
     * If the hex color includes an alpha component, it converts it to an appropriate value between 0 and 127 for use with GD functions
     *
     * @param string $hexColor The hex color string, optionally with an alpha channel (#000000, #ff0000ff)
     * @return ColorInterface The corresponding Color object with RGB and alpha values
     */
   
private function hex2rgb(string $hexColor): ColorInterface
   
{
       
$hexColor = ltrim($hexColor, '#');

        if (!
preg_match('/^[0-9A-Fa-f]{6}$|^[0-9A-Fa-f]{8}$/', $hexColor)) {
            return new
Color(0, 0, 0);
        }

       
$r = hexdec(substr($hexColor, 0, 2));
       
$g = hexdec(substr($hexColor, 2, 2));
       
$b = hexdec(substr($hexColor, 4, 2));

        if (
strlen($hexColor) === 8) {
           
$alpha = hexdec(substr($hexColor, 6, 2));

           
$alphaGD = (int) round(($alpha / 255) * 127);

            return new
Color($r, $g, $b, $alphaGD);
        }

        return new
Color($r, $g, $b);
    }
}