PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Monday, September 19, 2022

[FIXED] How to split "non-animated and animated" pictures, for correctly use resize function

 September 19, 2022     ajax, imagemagick, imagick, php     No comments   

Issue

With this script I can upload multiple images with animations or without. Included many functions: resize, watermark, correct orientation, send data to ajax, etc...

<?php
define('FORUM_PATH', '/.../');
require_once (FORUM_PATH . '.../login.php');
$ipbMemberLoginApi = new apiMemberLogin();
$ipbMemberLoginApi->init();
$member = $ipbMemberLoginApi->getMember();
$id = ($member['member_id']);
$countFiles = count($_FILES['files']['name']);
$upload_location = "uploads/$id/" . date("ymd") . "/";
if (!is_dir($upload_location)) mkdir($upload_location, 0755, true);
$chars = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789';
$files_arr = array();
for ($i = 0;$i < $countFiles;$i++) {
    $fileName = $_FILES['files']['name'][$i];
    $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
    $valid_ext = array("png", "jpeg", "jpg", "webp", "gif", "bmp");
    if (in_array($ext, $valid_ext)) {
        $imgName = $chars[mt_rand(1, 62) ] . substr(str_shuffle(uniqid()), 0, 6) . '.' . $ext;
        $path = $upload_location . $imgName;
        if (move_uploaded_file($_FILES['files']['tmp_name'][$i], $path)) {
            $abort = false;
            $im = new Imagick();
            try {
                $im->pingImage($path);
            }
            catch(ImagickException $e) {
                unlink($path);
                $files_arr['BadIMG'][] = $fileName;
                $abort = true;
            }
            if (!$abort) {
                if ($ext == "gif") {
                    $file = file_get_contents($path);
                    $animated = preg_match('#(\x00\x21\xF9\x04.{4}\x00\x2C.*){2,}#s', $file);
                }
                if ($animated != 1) {
                    //For non-animated pictures
                    $image = new Imagick($path);
                    $props = $image->getImageProperties('exif:Orientation', true);
                    $orientation = isset($props['exif:Orientation']) ? $props['exif:Orientation'] : null;
                    if ($orientation != 0) {
                        switch ($image->getImageOrientation()) {
                            case Imagick::ORIENTATION_TOPLEFT:
                                break;
                            case Imagick::ORIENTATION_TOPRIGHT:
                                $image->flopImage();
                                break;
                            case Imagick::ORIENTATION_BOTTOMRIGHT:
                                $image->rotateImage("#000", 180);
                                break;
                            case Imagick::ORIENTATION_BOTTOMLEFT:
                                $image->flopImage();
                                $image->rotateImage("#000", 180);
                                break;
                            case Imagick::ORIENTATION_LEFTTOP:
                                $image->flopImage();
                                $image->rotateImage("#000", -90);
                                break;
                            case Imagick::ORIENTATION_RIGHTTOP:
                                $image->rotateImage("#000", 90);
                                break;
                            case Imagick::ORIENTATION_RIGHTBOTTOM:
                                $image->flopImage();
                                $image->rotateImage("#000", 90);
                                break;
                            case Imagick::ORIENTATION_LEFTBOTTOM:
                                $image->rotateImage("#000", -90);
                                break;
                            default:
                                break;
                        }
                        $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
                        $image->writeImage($path);
                    }
                    $im->readImage($path);
                    $max_width = 1024;
                    $max_height = 768;
                    $im->stripImage();
                    $im->resizeImage(min($im->getImageWidth(), $max_width), min($im->getImageHeight(), $max_height), imagick::FILTER_CATROM, 1, true);
                    $imWidth = $im->getImageWidth();
                    $imHeight = $im->getImageHeight();
                    if ($imWidth < 150 || $imHeight < 150) {
                        $watermark = new Imagick("noWatermark.png");
                    } elseif ($imWidth < 401 || $imHeight < 401) {
                        $watermark = new Imagick("watermark_small.png");
                    } else {
                        $watermark = new Imagick("watermark.png");
                    }
                    $margin_right = 2;
                    $margin_bottom = 2;
                    $x = $im->getImageWidth() - $watermark->getImageWidth() - $margin_right;
                    $y = $im->getImageHeight() - $watermark->getImageHeight() - $margin_bottom;
                    $im->compositeImage($watermark, Imagick::COMPOSITE_OVER, $x, $y);
                    $watermark->destroy();
                    file_put_contents($path, $im);
                    $files_arr['GoodIMG'][] = str_replace('uploads/', '', $path);
                } else {
                    //For animated pictures
                    system("convert $path -coalesce -repage 0x0 -scale 800x\> -layers Optimize $path");
                    $imGif = new Imagick($path);
                    $max_size = 180;
                    $imGifWidth = $imGif->getImageWidth();
                    $imGifHeight = $imGif->getImageHeight();
                    if ($imGifWidth || $imGifHeight > 180) {
                        system("convert $path -coalesce null: watermark.png -gravity SouthEast -geometry +0+0 -layers composite -layers optimize $path");
                    }
                    $files_arr['GoodIMG'][] = str_replace('uploads/', '', $path);
                }
            }
        }
    }
}
header('Content-Type: application/json');
echo json_encode($files_arr);
die;

PHP Version 5.6.40

But have problem: If I upload ($animated == 1).GIF together with ($animated != 1), this picture ($animated != 1) goes in function for resize animated pictures.

How to split animated picture from non-animated picture correctly if I upload together?

Added more details:

If try upload:

  • AAA.gif - animated
  • BBB.jpeg - non-animated

BBB.jpeg goes in function for resize animated pictures.

But, if try upload:

  • AAA.jpeg - non-animated
  • BBB.gif - animated

AAA.jpeg goes in function for resize non-animated pictures. This is a correct.


Solved

        if ($ext == "gif") {
            $file = file_get_contents($path);
            $animated = preg_match('#(\x00\x21\xF9\x04.{4}\x00\x2C.*){2,}#s', $file);
        } else {
            $animated = 0;
        }

Solution

After you find an animated image and set $animated to 1, you only set $animated back to 0, when you find a non-animated gif image, but not if you find a non-animated non-gif image.



Answered By - hlg
Answer Checked By - Gilberto Lyons (PHPFixing Admin)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing