Back to PhocaGalleryImageRotate class

Method rotateImage

public static
rotateImage
(mixed $thumbName, mixed $size, mixed $angle = 90, mixed &$errorMsg)

Method rotateImage - Source code

public static function rotateImage($thumbName, $size, $angle = 90, &$errorMsg)
{
    $params = ComponentHelper::getParams('com_phocagallery');
    $jfile_thumbs = $params->get('jfile_thumbs', 1);
    $jpeg_quality = $params->get('jpeg_quality', 85);
    $jpeg_quality = PhocaGalleryImage::getJpegQuality($jpeg_quality);
    // Try to change the size
    $memory = 8;
    $memoryLimitChanged = 0;
    $memory = (int) ini_get('memory_limit');
    if ($memory == 0) {
        $memory = 8;
    }
    $fileIn = $thumbName->abs;
    $fileOut = $thumbName->abs;
    if ($fileIn !== '' && file_exists($fileIn)) {
        //array of width, height, IMAGETYPE, "height=x width=x" (string)
        list($w, $h, $type) = GetImageSize($fileIn);
        // we got the info from GetImageSize
        if ($w > 0 && $h > 0 && $type != '') {
            // Change the $w against $h because of rotating
            $src = array(0, 0, $w, $h);
            $dst = array(0, 0, $h, $w);
        } else {
            $errorMsg = 'ErrorWorHorType';
            return false;
        }
        // Try to increase memory
        if ($memory < 50) {
            ini_set('memory_limit', '50M');
            $memoryLimitChanged = 1;
        }
        switch ($type) {
            case IMAGETYPE_JPEG:
                if (!function_exists('ImageCreateFromJPEG')) {
                    $errorMsg = 'ErrorNoJPGFunction';
                    return false;
                }
                //$image1 = ImageCreateFromJPEG($fileIn);
                try {
                    $image1 = ImageCreateFromJPEG($fileIn);
                } catch (\Exception $exception) {
                    $errorMsg = 'ErrorJPGFunction';
                    return false;
                }
                break;
            case IMAGETYPE_PNG:
                if (!function_exists('ImageCreateFromPNG')) {
                    $errorMsg = 'ErrorNoPNGFunction';
                    return false;
                }
                //$image1 = ImageCreateFromPNG($fileIn);
                try {
                    $image1 = ImageCreateFromPNG($fileIn);
                } catch (\Exception $exception) {
                    $errorMsg = 'ErrorPNGFunction';
                    return false;
                }
                break;
            case IMAGETYPE_GIF:
                if (!function_exists('ImageCreateFromGIF')) {
                    $errorMsg = 'ErrorNoGIFFunction';
                    return false;
                }
                //$image1 = ImageCreateFromGIF($fileIn);
                try {
                    $image1 = ImageCreateFromGIF($fileIn);
                } catch (\Exception $exception) {
                    $errorMsg = 'ErrorGIFFunction';
                    return false;
                }
                break;
            case IMAGETYPE_WEBP:
                if (!function_exists('ImageCreateFromWEBP')) {
                    $errorMsg = 'ErrorNoWEBPFunction';
                    return false;
                }
                //$image1 = ImageCreateFromGIF($fileIn);
                try {
                    $image1 = ImageCreateFromWEBP($fileIn);
                } catch (\Exception $exception) {
                    $errorMsg = 'ErrorWEBPFunction';
                    return false;
                }
                break;
            case IMAGETYPE_WBMP:
                if (!function_exists('ImageCreateFromWBMP')) {
                    $errorMsg = 'ErrorNoWBMPFunction';
                    return false;
                }
                //$image1 = ImageCreateFromWBMP($fileIn);
                try {
                    $image1 = ImageCreateFromWBMP($fileIn);
                } catch (\Exception $exception) {
                    $errorMsg = 'ErrorWBMPFunction';
                    return false;
                }
                break;
            default:
                $errorMsg = 'ErrorNotSupportedImage';
                return false;
                break;
        }
        if ($image1) {
            // Building image for ROTATING
            /*	$image2 = @ImageCreateTruecolor($dst[2], $dst[3]);
            			if (!$image2) {
            				return 'ErrorNoImageCreateTruecolor';
            			}*/
            /*	if(!function_exists("imagerotate")) {
            				$errorMsg = 'ErrorNoImageRotate';
            				return false;
            			}*/
            switch ($type) {
                case IMAGETYPE_PNG:
                case IMAGETYPE_WEBP:
                    //	imagealphablending($image1, false);
                    //	imagesavealpha($image1, true);
                    if (!function_exists("imagecolorallocate")) {
                        $errorMsg = 'ErrorNoImageColorAllocate';
                        return false;
                    }
                    if (!function_exists("imagefill")) {
                        $errorMsg = 'ErrorNoImageFill';
                        return false;
                    }
                    if (!function_exists("imagecolortransparent")) {
                        $errorMsg = 'ErrorNoImageColorTransparent';
                        return false;
                    }
                    $colBlack = imagecolorallocate($image1, 0, 0, 0);
                    if (!function_exists("imagerotate")) {
                        $image2 = PhocaGalleryImageRotate::imageRotate($image1, $angle, $colBlack);
                    } else {
                        $image2 = imagerotate($image1, $angle, $colBlack);
                    }
                    //imagefill($image2, 0, 0, $colBlack);
                    //imagecolortransparent($image2, $colBlack);
                    imagealphablending($image2, false);
                    imagesavealpha($image2, true);
                    break;
                default:
                    if (!function_exists("imagerotate")) {
                        $image2 = PhocaGalleryImageRotate::imageRotate($image1, $angle, 0);
                    } else {
                        $image2 = imageRotate($image1, $angle, 0);
                    }
                    break;
            }
            // Get the image size and resize the rotated image if necessary
            $rotateWidth = imagesx($image2);
            // Get the size from rotated image
            $rotateHeight = imagesy($image2);
            // Get the size from rotated image
            $parameterSize = PhocaGalleryFileThumbnail::getThumbnailResize($size);
            $newWidth = $parameterSize['width'];
            // Get maximum sizes, they can be displayed
            $newHeight = $parameterSize['height'];
            // Get maximum sizes, they can be displayed
            $scale = $newWidth / $rotateWidth < $newHeight / $rotateHeight ? $newWidth / $rotateWidth : $newHeight / $rotateHeight;
            // smaller rate
            $src = array(0, 0, $rotateWidth, $rotateHeight);
            $dst = array(0, 0, floor($rotateWidth * $scale), floor($rotateHeight * $scale));
            // If original is smaller than thumbnail size, don't resize it
            if ($src[2] > $dst[2] || $src[3] > $dst[3]) {
                // Building image for RESIZING THE ROTATED IMAGE
                $image3 = @ImageCreateTruecolor($dst[2], $dst[3]);
                if (!$image3) {
                    $errorMsg = 'ErrorNoImageCreateTruecolor';
                    return false;
                }
                ImageCopyResampled($image3, $image2, $dst[0], $dst[1], $src[0], $src[1], $dst[2], $dst[3], $src[2], $src[3]);
                switch ($type) {
                    case IMAGETYPE_PNG:
                    case IMAGETYPE_WEBP:
                        //	imagealphablending($image2, true);
                        //	imagesavealpha($image2, true);
                        if (!function_exists("imagecolorallocate")) {
                            $errorMsg = 'ErrorNoImageColorAllocate';
                            return false;
                        }
                        if (!function_exists("imagefill")) {
                            $errorMsg = 'ErrorNoImageFill';
                            return false;
                        }
                        if (!function_exists("imagecolortransparent")) {
                            $errorMsg = 'ErrorNoImageColorTransparent';
                            return false;
                        }
                        $colBlack = imagecolorallocate($image3, 0, 0, 0);
                        imagefill($image3, 0, 0, $colBlack);
                        imagecolortransparent($image3, $colBlack);
                        break;
                }
            } else {
                $image3 = $image2;
            }
            switch ($type) {
                case IMAGETYPE_JPEG:
                    if (!function_exists('ImageJPEG')) {
                        $errorMsg = 'ErrorNoJPGFunction';
                        return false;
                    }
                    if ($jfile_thumbs == 1) {
                        ob_start();
                        if (!@ImageJPEG($image3, NULL, $jpeg_quality)) {
                            ob_end_clean();
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                        $imgJPEGToWrite = ob_get_contents();
                        ob_end_clean();
                        if (!File::write($fileOut, $imgJPEGToWrite)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    } else {
                        if (!@ImageJPEG($image3, $fileOut, $jpeg_quality)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    }
                    break;
                case IMAGETYPE_PNG:
                    if (!function_exists('ImagePNG')) {
                        $errorMsg = 'ErrorNoPNGFunction';
                        return false;
                    }
                    if ($jfile_thumbs == 1) {
                        ob_start();
                        if (!@ImagePNG($image3, NULL)) {
                            ob_end_clean();
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                        $imgPNGToWrite = ob_get_contents();
                        ob_end_clean();
                        if (!File::write($fileOut, $imgPNGToWrite)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    } else {
                        if (!@ImagePNG($image3, $fileOut)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    }
                    break;
                case IMAGETYPE_GIF:
                    if (!function_exists('ImageGIF')) {
                        $errorMsg = 'ErrorNoGIFFunction';
                        return false;
                    }
                    if ($jfile_thumbs == 1) {
                        ob_start();
                        if (!@ImageGIF($image3, NULL)) {
                            ob_end_clean();
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                        $imgGIFToWrite = ob_get_contents();
                        ob_end_clean();
                        if (!File::write($fileOut, $imgGIFToWrite)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    } else {
                        if (!@ImageGIF($image3, $fileOut)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    }
                    break;
                case IMAGETYPE_WEBP:
                    if (!function_exists('ImageWEBP')) {
                        $errorMsg = 'ErrorNoWEBPFunction';
                        return false;
                    }
                    if ($jfile_thumbs == 1) {
                        ob_start();
                        if (!@imagewebp($image3, NULL)) {
                            ob_end_clean();
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                        $imgWEBPToWrite = ob_get_contents();
                        ob_end_clean();
                        if (!File::write($fileOut, $imgWEBPToWrite)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    } else {
                        if (!@imagewebp($image3, $fileOut)) {
                            $errorMsg = 'ErrorWriteFile';
                            return false;
                        }
                    }
                    break;
                default:
                    $errorMsg = 'ErrorNotSupportedImage';
                    return false;
                    break;
            }
            // free memory
            if (isset($image1)) {
                ImageDestroy($image1);
            }
            // Original
            if (isset($image2)) {
                ImageDestroy($image2);
            }
            // Original
            if (isset($image3)) {
                @ImageDestroy($image3);
            }
            // Resized
            if ($memoryLimitChanged == 1) {
                $memoryString = $memory . 'M';
                ini_set('memory_limit', $memoryString);
            }
            return true;
            // Success
        } else {
            $errorMsg = PhocaGalleryUtils::setMessage($errorMsg, Text::_('COM_PHOCAGALLERY_ERROR_IMAGE_NOT_PROCESS'));
            return false;
        }
        if ($memoryLimitChanged == 1) {
            $memoryString = $memory . 'M';
            ini_set('memory_limit', $memoryString);
        }
    }
    $errorMsg = Text::_('COM_PHOCAGALLERY_FILEORIGINAL_NOT_EXISTS');
    return false;
}