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

declare(strict_types=1);

namespace 
InterventionImageDriversGdModifiers;

use 
InterventionImageExceptionsAnimationException;
use 
InterventionImageExceptionsNotSupportedException;
use 
InterventionImageExceptionsRuntimeException;
use 
InterventionImageGeometryPoint;
use 
InterventionImageInterfacesImageInterface;
use 
InterventionImageInterfacesSpecializedInterface;
use 
InterventionImageModifiersTrimModifier as GenericTrimModifier;

class 
TrimModifier extends GenericTrimModifier implements SpecializedInterface
{
    
/**
     * {@inheritdoc}
     *
     * @see ModifierInterface::apply()
     */
    
public function apply(ImageInterface $image): ImageInterface
    
{
        if (
$image->isAnimated()) {
            throw new 
NotSupportedException('Trim modifier cannot be applied to animated images.');
        }

        
// apply tolerance with a min. value of .5 because the default tolerance of '0' should
        // already trim away similar colors which is not the case with imagecropauto.
        
$trimmed imagecropauto(
            
$image->core()->native(),
            
IMG_CROP_THRESHOLD,
            
max([.5$this->tolerance 10]),
            
$this->trimColor($image)
        );

        
// if the tolerance is very high, it is possible that no image is left.
        // imagick returns a 1x1 pixel image in this case. this does the same.
        
if ($trimmed === false) {
            
$trimmed $this->driver()->createImage(11)->core()->native();
        }

        
$image->core()->setNative($trimmed);

        return 
$image;
    }

    
/**
     * Create an average color from the colors of the four corner points of the given image
     *
     * @param ImageInterface $image
     * @throws RuntimeException
     * @throws AnimationException
     * @return int
     */
    
private function trimColor(ImageInterface $image): int
    
{
        
// trim color base
        
$red 0;
        
$green 0;
        
$blue 0;

        
// corner coordinates
        
$size $image->size();
        
$cornerPoints = [
            new 
Point(00),
            new 
Point($size->width() - 10),
            new 
Point(0$size->height() - 1),
            new 
Point($size->width() - 1$size->height() - 1),
        ];

        
// create an average color to be used in trim operation
        
foreach ($cornerPoints as $pos) {
            
$cornerColor imagecolorat($image->core()->native(), $pos->x(), $pos->y());
            
$rgb imagecolorsforindex($image->core()->native(), $cornerColor);
            
$red += round(round(($rgb['red'] / 51)) * 51);
            
$green += round(round(($rgb['green'] / 51)) * 51);
            
$blue += round(round(($rgb['blue'] / 51)) * 51);
        }

        
$red = (int) round($red 4);
        
$green = (int) round($green 4);
        
$blue = (int) round($blue 4);

        return 
imagecolorallocate($image->core()->native(), $red$green$blue);
    }
}
Онлайн: 0
Реклама