private function calculateCrop(array $parameters, array $imageSize) {
        $focalX = $parameters['poi'][0];
        $focalY  = $parameters['poi'][1];

        $sourceWidth = $imageSize['width'];
        $sourceHeight = $imageSize['height'];
        $sourceRatio  = $sourceWidth / $sourceHeight;

        $targetWidth = $parameters['width'];
        $targetHeight = $parameters['height'];
        $targetRatio  = $targetWidth / $targetHeight;

        $growFactor = $this->getGrowFactor($parameters['closeness']);
        $sourcePortionThreshold = $this->getSourcePercentageThreshold($parameters['closeness']);

        if ($sourceRatio >= $targetRatio) {
            // Image is wider than needed, crop from the sides
            $cropWidth = (int) ceil(
                $targetRatio * max(
                    min($sourceHeight, $targetHeight * $growFactor),
                    $sourceHeight * $sourcePortionThreshold
                )
            );
            $cropHeight = (int) floor($cropWidth / $targetRatio);
        } else {
            // Image is taller than needed, crop from the top/bottom
            $cropHeight = (int) ceil(
                max(
                    min($sourceWidth, $targetWidth * $growFactor),
                    $sourceWidth * $sourcePortionThreshold
                ) / $targetRatio
            );
            $cropWidth = (int) floor($cropHeight * $targetRatio);
        }

        $cropTop = (int) ($focalY - floor($cropHeight / 2));
        $cropLeft = (int) ($focalX - floor($cropWidth / 2));

        // Make sure that we're not cropping outside the image on the x axis
        if ($cropLeft < 0) {
            $cropLeft = 0;
        } else if ($cropLeft + $cropWidth > $sourceWidth) {
            $cropLeft = $sourceWidth - $cropWidth;
        }

        // Make sure that we're not cropping outside the image on the y axis
        if ($cropTop < 0) {
            $cropTop = 0;
        } else if ($cropTop + $cropHeight > $sourceHeight) {
            $cropTop = $sourceHeight - $cropHeight;
        }

        return [
            'width' => $cropWidth,
            'height' => $cropHeight,
            'x' => $cropLeft,
            'y' => $cropTop,
        ];
    }
private function calculateCrop(array $parameters, array $imageSize) {
        $focalX = $parameters['poi'][0];
        $focalY  = $parameters['poi'][1];

        $sourceWidth = $imageSize['width'];
        $sourceHeight = $imageSize['height'];
        $sourceRatio  = $sourceWidth / $sourceHeight;

        $targetWidth = $parameters['width'];
        $targetHeight = $parameters['height'];
        $targetRatio  = $targetWidth / $targetHeight;

        $growFactor = $this->getGrowFactor($parameters['closeness']);
        $sourcePortionThreshold = $this->getSourcePercentageThreshold($parameters['closeness']);

        if ($sourceRatio >= $targetRatio) {
            // Image is wider than needed, crop from the sides
            $cropWidth = (int) ceil(
                $targetRatio * max(
                    min($sourceHeight, $targetHeight * $growFactor),
                    $sourceHeight * $sourcePortionThreshold
                )
            );
            $cropHeight = (int) floor($cropWidth / $targetRatio);
        } else {
            // Image is taller than needed, crop from the top/bottom
            $cropHeight = (int) ceil(
                max(
                    min($sourceWidth, $targetWidth * $growFactor),
                    $sourceWidth * $sourcePortionThreshold
                ) / $targetRatio
            );
            $cropWidth = (int) floor($cropHeight * $targetRatio);
        }

        $cropTop = (int) ($focalY - floor($cropHeight / 2));
        $cropLeft = (int) ($focalX - floor($cropWidth / 2));

        // Make sure that we're not cropping outside the image on the x axis
        if ($cropLeft < 0) {
            $cropLeft = 0;
        } else if ($cropLeft + $cropWidth > $sourceWidth) {
            $cropLeft = $sourceWidth - $cropWidth;
        }

        // Make sure that we're not cropping outside the image on the y axis
        if ($cropTop < 0) {
            $cropTop = 0;
        } else if ($cropTop + $cropHeight > $sourceHeight) {
            $cropTop = $sourceHeight - $cropHeight;
        }

        return [
            'width' => $cropWidth,
            'height' => $cropHeight,
            'x' => $cropLeft,
            'y' => $cropTop,
        ];
    }
private function calculateCrop ( array $ parameters , array $ imageSize ) { $ focalX = $ parameters [ 'poi' ] [ 0 ] ; $ focalY = $ parameters [ 'poi' ] [ 1 ] ; $ sourceWidth = $ imageSize [ 'width' ] ; $ sourceHeight = $ imageSize [ 'height' ] ; $ sourceRatio = $ sourceWidth / $ sourceHeight ; $ targetWidth = $ parameters [ 'width' ] ; $ targetHeight = $ parameters [ 'height' ] ; $ targetRatio = $ targetWidth / $ targetHeight ; $ growFactor = $ this -> getGrowFactor ( $ parameters [ 'closeness' ] ) ; $ sourcePortionThreshold = $ this -> getSourcePercentageThreshold ( $ parameters [ 'closeness' ] ) ; if ( $ sourceRatio >= $ targetRatio ) { // Image is wider than needed, crop from the sides $ cropWidth = ( int ) ceil ( $ targetRatio * max ( min ( $ sourceHeight , $ targetHeight * $ growFactor ) , $ sourceHeight * $ sourcePortionThreshold ) ) ; $ cropHeight = ( int ) floor ( $ cropWidth / $ targetRatio ) ; } else { // Image is taller than needed, crop from the top/bottom $ cropHeight = ( int ) ceil ( max ( min ( $ sourceWidth , $ targetWidth * $ growFactor ) , $ sourceWidth * $ sourcePortionThreshold ) / $ targetRatio ) ; $ cropWidth = ( int ) floor ( $ cropHeight * $ targetRatio ) ; } $ cropTop = ( int ) ( $ focalY - floor ( $ cropHeight / 2 ) ) ; $ cropLeft = ( int ) ( $ focalX - floor ( $ cropWidth / 2 ) ) ; // Make sure that we're not cropping outside the image on the x axis if ( $ cropLeft < 0 ) { $ cropLeft = 0 ; } else if ( $ cropLeft + $ cropWidth > $ sourceWidth ) { $ cropLeft = $ sourceWidth - $ cropWidth ; } // Make sure that we're not cropping outside the image on the y axis if ( $ cropTop < 0 ) { $ cropTop = 0 ; } else if ( $ cropTop + $ cropHeight > $ sourceHeight ) { $ cropTop = $ sourceHeight - $ cropHeight ; } return [ 'width' => $ cropWidth , 'height' => $ cropHeight , 'x' => $ cropLeft , 'y' => $ cropTop , ] ; }
Calculate the coordinates and size of the crop area

@param array $parameters
@param array $imageSize
@return array Crop data
Calculate the coordinates and size of the crop area