Вход Регистрация
Файл: vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php
Строк: 143
<?php

declare(strict_types=1);

namespace 
InterventionImageDriversGdModifiers;

use 
InterventionImageColorsRgbColorspace as Rgb;
use 
InterventionImageDriversGdCloner;
use 
InterventionImageExceptionsModifierException;
use 
InterventionImageInterfacesFrameInterface;
use 
InterventionImageInterfacesImageInterface;
use 
InterventionImageInterfacesSizeInterface;
use 
InterventionImageInterfacesSpecializedInterface;
use 
InterventionImageModifiersContainModifier as GenericContainModifier;
use 
InterventionImageColorsRgbColor as RgbColor;
use 
InterventionImageExceptionsDriverException;
use 
InterventionImageExceptionsInvalidArgumentException;
use 
InterventionImageExceptionsStateException;

class 
ContainModifier extends GenericContainModifier implements SpecializedInterface
{
    
/**
     * {@inheritdoc}
     *
     * @see ModifierInterface::apply()
     *
     * @throws InvalidArgumentException
     * @throws ModifierException
     * @throws StateException
     * @throws DriverException
     */
    
public function apply(ImageInterface $image): ImageInterface
    
{
        
$crop $this->cropSize($image);
        
$resize $this->resizeSize($image);
        
$backgroundColor $this->backgroundColor()->toColorspace(Rgb::class);

        if (!
$backgroundColor instanceof RgbColor) {
            throw new 
ModifierException('Failed to normalize background color to RGB color space');
        }

        foreach (
$image as $frame) {
            
$this->modify($frame$crop$resize$backgroundColor);
        }

        return 
$image;
    }

    
/**
     * @throws InvalidArgumentException
     * @throws ModifierException
     * @throws DriverException
     */
    
private function modify(
        
FrameInterface $frame,
        
SizeInterface $crop,
        
SizeInterface $resize,
        
RgbColor $backgroundColor,
    ): 
void {
        
// create new gd image
        
$modified Cloner::cloneEmpty($frame->native(), $resize$backgroundColor);

        
// make image area transparent to keep transparency
        // even if background-color is set
        
$transparent imagecolorallocatealpha(
            
$modified,
            
$backgroundColor->red()->value(),
            
$backgroundColor->green()->value(),
            
$backgroundColor->blue()->value(),
            
127,
        );

        
imagealphablending($modifiedfalse); // do not blend / just overwrite

        
imagecolortransparent($modified$transparent);
        
imagefilledrectangle(
            
$modified,
            
$crop->pivot()->x(),
            
$crop->pivot()->y(),
            
$crop->pivot()->x() + $crop->width() - 1,
            
$crop->pivot()->y() + $crop->height() - 1,
            
$transparent,
        );

        
// copy image from original with background alpha
        
imagealphablending($modifiedtrue);
        
imagecopyresampled(
            
$modified,
            
$frame->native(),
            
$crop->pivot()->x(),
            
$crop->pivot()->y(),
            
0,
            
0,
            
$crop->width(),
            
$crop->height(),
            
$frame->size()->width(),
            
$frame->size()->height(),
        );

        
// set new content as resource
        
$frame->setNative($modified);
    }
}
Онлайн: 2
Реклама