পিএইচপি-তে চিত্রের আকার পরিবর্তন করুন


96

আমি কিছু পিএইচপি কোড লিখতে চাই যা 147x147px এ একটি ফর্মের মাধ্যমে আপলোড করা যে কোনও চিত্রকে স্বয়ংক্রিয়ভাবে আকার দেয়, তবে এটি সম্পর্কে কীভাবে যেতে হয় সে সম্পর্কে আমার কোনও ধারণা নেই (আমি কোনও পিএইচপি নবাগত নই)।

এখনও অবধি, আমি চিত্রগুলি সফলভাবে আপলোড পেয়েছি, ফাইল টাইপগুলি স্বীকৃত হচ্ছে এবং নামগুলি সাফ হয়েছে, তবে আমি কোডটিতে পুনরায় আকার দেওয়ার কার্যকারিতা যুক্ত করতে চাই। উদাহরণস্বরূপ, আমি একটি পরীক্ষার চিত্র পেয়েছি যা ২.৩ এমবি এবং ১৩৩৩x১31৩৩ মাত্রিক আকারে রয়েছে এবং আমি কোডটি এটি আকার করে দিতে চাই, যা আমি অনুমান করছি যে চিত্রটির ফাইলাইজকেও নাটকীয়ভাবে সংকুচিত করবে।

এখনও অবধি, আমি নিম্নলিখিত পেয়েছি:

if ($_FILES) {
                //Put file properties into variables
                $file_name = $_FILES['profile-image']['name'];
                $file_size = $_FILES['profile-image']['size'];
                $file_tmp_name = $_FILES['profile-image']['tmp_name'];

                //Determine filetype
                switch ($_FILES['profile-image']['type']) {
                    case 'image/jpeg': $ext = "jpg"; break;
                    case 'image/png': $ext = "png"; break;
                    default: $ext = ''; break;
                }

                if ($ext) {
                    //Check filesize
                    if ($file_size < 500000) {
                        //Process file - clean up filename and move to safe location
                        $n = "$file_name";
                        $n = ereg_replace("[^A-Za-z0-9.]", "", $n);
                        $n = strtolower($n);
                        $n = "avatars/$n";
                        move_uploaded_file($file_tmp_name, $n);
                    } else {
                        $bad_message = "Please ensure your chosen file is less than 5MB.";
                    }
                } else {
                    $bad_message = "Please ensure your image is of filetype .jpg or.png.";
                }
            }
$query = "INSERT INTO users (image) VALUES ('$n')";
mysql_query($query) or die("Insert failed. " . mysql_error() . "<br />" . $query);

আপনি কি এই নমুনাগুলি পছন্দ করেছেন এই স্ট্যাকওভারফ্লো :: প্রশ্নগুলি / 10029838/image-resize-with-php ?
কোনি রিচার্ডস

upload_max_filesizeইন পরিবর্তন না করে php.ini, প্রথমত কি এর চেয়ে বেশি আকারের ফাইল আপলোড করা সম্ভব upload_max_filesize? এর চেয়ে বেশি আকারের চিত্রকে আবার আকার দেওয়ার কোনও সুযোগ আছে কি upload_max_filesize? পরিবর্তন upload_max_filesizeনা করেphp.ini
rch

উত্তর:


143

হয় আপনি পিএইচপি এর ব্যবহার করতে হবে করে ImageMagick বা জিডি ইমেজ সঙ্গে কাজ ফাংশন।

জিডি সহ, উদাহরণস্বরূপ, এটি যতটা সহজ ...

function resize_image($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}

এবং আপনি এই ফাংশন কল করতে পারে, যেমন ...

$img = resize_image(‘/path/to/some/image.jpg’, 200, 200);

ব্যক্তিগত অভিজ্ঞতা থেকে, জিডির চিত্র পুনরায় মডেলিং ফাইলের আকারকেও নাটকীয়ভাবে হ্রাস করে, বিশেষত কাঁচা ডিজিটাল ক্যামেরা চিত্রগুলি পুনরায় মডেল করার সময়।


4
আপনি কি ছবি হিসাবে স্টোরেজ করছেন BLOB? আমি ফাইল সিস্টেমে চিত্রগুলি সংরক্ষণ এবং আপনার ডাটাবেসে রেফারেন্স সন্নিবেশ করানোর পরামর্শ দেব। আপনার কাছে অন্যান্য কী কী বিকল্প রয়েছে তা দেখার জন্য আমি পুরো জিডি (বা ইমেজম্যাগিক) ডকুমেন্টেশন পড়ারও পরামর্শ দিচ্ছি।
ইয়ান আতকিন

20
দ্রষ্টব্য, এই সমাধানটি কেবল JPEGs এর জন্য কাজ করে। আপনি নিম্নলিখিত চিত্রগুলির সাথে ইমেজক্রিয়াট্রোমজপেইগ প্রতিস্থাপন করতে পারেন: ইমেজক্রিয়াট্রোমগিডি, ইমেজক্রিয়াট্রোমগিফ, ইমেজক্রিয়াট্রোমপম্ব্পিং, ইমেজক্রিয়াট্রোমস্ট্রিং, ইমেজক্রিয়াট্রোমবম্ব্প, ইমেজক্রিয়াট্রোমব্লম্বস, ইমেজক্রিয়াট্রফ্র্যামেক্সএমএম।
ক্রিস হ্যানসন

4
@ গর্ডনফ্রিমন গ্রেট কোড স্নিপেটের জন্য ধন্যবাদ, তবে সেখানে একটি গ্লিট রয়েছে, উচ্চতার অংশে যুক্ত abs(), মত ceil($width-($width*abs($r-$w/$h)))এবং একই রকম। এটি কিছু ক্ষেত্রে প্রয়োজন।
আরমান পি।

4
ডিফল্ট শস্যের মানটিকে সত্যে পরিবর্তন করা, এবং চিত্রটি http://wallpapercave.com/wp/wc1701171.jpg400x128 এ আকার দিন (ব্যানার) একটি কালো চিত্র তৈরি করেছে; আমি কেন বুঝতে পারছি না কেন এটি এমন করছে।
ফক্সআইএনফ্লেমে

4
ফাইল সিস্টেমে পুনরায় আকারিত চিত্রটি সংরক্ষণ করতে লাইনের imagejpeg($dst, $file);পরে যুক্ত করুন imagecopyresampled($dst,...$fileআপনি যদি মূলটি ওভাররাইট করতে না চান তবে পরিবর্তন করুন ।
উইকিল

23

এই সংস্থান (ভাঙা লিঙ্ক )টিও বিবেচনার জন্য - কিছু খুব পরিপাটি কোড যা জিডি ব্যবহার করে। তবে আমি এই ফাংশনটি তৈরি করতে তাদের চূড়ান্ত কোড স্নিপেটটি সংশোধন করেছি যা অপের প্রয়োজনীয়তা পূরণ করে ...

function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {
    
    $target_dir = "your-uploaded-images-folder/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);
    
    $image = new SimpleImage();
    $image->load($_FILES[$html_element_name]['tmp_name']);
    $image->resize($new_img_width, $new_img_height);
    $image->save($target_file);
    return $target_file; //return name of saved file in case you want to store it in you database or show confirmation message to user
    
}

আপনাকে এই পিএইচপি ফাইলটি অন্তর্ভুক্ত করতে হবে ...

<?php
 
/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*
*/
 
class SimpleImage {
 
   var $image;
   var $image_type;
 
   function load($filename) {
 
      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {
 
         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {
 
         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {
 
         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
 
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {
 
         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {
 
         imagepng($this->image,$filename);
      }
      if( $permissions != null) {
 
         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {
 
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {
 
         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {
 
         imagepng($this->image);
      }
   }
   function getWidth() {
 
      return imagesx($this->image);
   }
   function getHeight() {
 
      return imagesy($this->image);
   }
   function resizeToHeight($height) {
 
      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }
 
   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }
 
   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }
 
   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }      
 
}
?>

4
আপনার নমুনা সেরা। এটি কৌতুক, নাটক, চুল তোলা ছাড়াই জেন্ড ফ্রেমওয়ার্কে সরাসরি কাজ করে। থাম্বস আপ

আমি মনে করি আপনার প্রয়োজনীয় সমস্ত কোডগুলি আমার উত্তর হওয়া উচিত, তবে এটির সাহায্যও হতে পারে: gist.github.com/arrowmedia/7863973
নিষিদ্ধ-জিওইনজিনিয়ারিং

20

সিম্পল ইউজ পিএইচপি ফাংশন ( ইমেজস্কেল ):

বাক্য গঠন:

imagescale ( $image , $new_width , $new_height )

উদাহরণ:

পদক্ষেপ: 1 ফাইলটি পড়ুন

$image_name =  'path_of_Image/Name_of_Image.jpg|png';      

পদক্ষেপ: 2: চিত্র ফাইলটি লোড করুন

 $image = imagecreatefromjpeg($image_name); // For JPEG
//or
 $image = imagecreatefrompng($image_name);   // For PNG

পদক্ষেপ: 3: আমাদের লাইফ-সেভার '_' | এ আসে চিত্রটি স্কেল করুন

   $imgResized = imagescale($image , 500, 400); // width=500 and height = 400
//  $imgResized is our final product

দ্রষ্টব্য: ইমেজস্কেল (PHP 5> = 5.5.0, পিএইচপি 7) এর জন্য কাজ করবে

সূত্র: আরও পড়তে ক্লিক করুন


পিএইচপি 5.6.3> এর সেরা সমাধান
প্যাটিটেক জুনিয়র

12

যদি আপনি দিক রেশন সম্পর্কে উদ্বিগ্ন হন না (যেমন আপনি চিত্রটিকে একটি নির্দিষ্ট মাত্রায় জোর করতে চান), তবে এখানে একটি সরল উত্তর দেওয়া হয়েছে

// for jpg 
function resize_imagejpg($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromjpeg($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

 // for png
function resize_imagepng($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefrompng($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

// for gif
function resize_imagegif($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromgif($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

এবার আপলোড অংশটি পরিচালনা করি handle প্রথম পদক্ষেপ, আপনার পছন্দসই ডিরেক্টরিতে ফাইল আপলোড করুন। তারপরে ফাইলের প্রকারের (jpg, png বা gif) উপর ভিত্তি করে উপরের ফাংশনগুলির মধ্যে একটি বলা হয় এবং আপনার আপলোড করা ফাইলটির নিখুঁত পথটি পাস করুন:

 // jpg  change the dimension 750, 450 to your desired values
 $img = resize_imagejpg('path/image.jpg', 750, 450);

রিটার্ন মান $imgএকটি রিসোর্স অবজেক্ট। আমরা একটি নতুন অবস্থানে সংরক্ষণ করতে পারি বা নীচের মত মূলটিকে ওভাররাইড করতে পারি:

 // again for jpg
 imagejpeg($img, 'path/newimage.jpg');

আশা করি এটি কাউকে সাহায্য করবে। চিত্রগুলি পুনরায় আকার দেওয়ার বিষয়ে আরও এই লিঙ্কগুলি দেখুন: পুনরায় আকার দিন ইমেজ এবং ইমেজজেপি ()


upload_max_filesizeইন পরিবর্তন না করে php.iniপ্রথমে আপনি এর চেয়ে বেশি সাইজের ফাইল আপলোড করতে পারবেন না upload_max_filesize। সেখানে আকারের ইমেজ চেয়ে বেশি আকার পরিবর্তন করতে কোন সুযোগ আছে কি upload_max_filesizeপরিবর্তন না করে upload_max_filesizephp.ini
RCH

6

আমি আশা করি আপনার জন্য কাজ করবে।

/**
         * Image re-size
         * @param int $width
         * @param int $height
         */
        function ImageResize($width, $height, $img_name)
        {
                /* Get original file size */
                list($w, $h) = getimagesize($_FILES['logo_image']['tmp_name']);


                /*$ratio = $w / $h;
                $size = $width;

                $width = $height = min($size, max($w, $h));

                if ($ratio < 1) {
                    $width = $height * $ratio;
                } else {
                    $height = $width / $ratio;
                }*/

                /* Calculate new image size */
                $ratio = max($width/$w, $height/$h);
                $h = ceil($height / $ratio);
                $x = ($w - $width / $ratio) / 2;
                $w = ceil($width / $ratio);
                /* set new file name */
                $path = $img_name;


                /* Save image */
                if($_FILES['logo_image']['type']=='image/jpeg')
                {
                    /* Get binary data from image */
                    $imgString = file_get_contents($_FILES['logo_image']['tmp_name']);
                    /* create image from string */
                    $image = imagecreatefromstring($imgString);
                    $tmp = imagecreatetruecolor($width, $height);
                    imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h);
                    imagejpeg($tmp, $path, 100);
                }
                else if($_FILES['logo_image']['type']=='image/png')
                {
                    $image = imagecreatefrompng($_FILES['logo_image']['tmp_name']);
                    $tmp = imagecreatetruecolor($width,$height);
                    imagealphablending($tmp, false);
                    imagesavealpha($tmp, true);
                    imagecopyresampled($tmp, $image,0,0,$x,0,$width,$height,$w, $h);
                    imagepng($tmp, $path, 0);
                }
                else if($_FILES['logo_image']['type']=='image/gif')
                {
                    $image = imagecreatefromgif($_FILES['logo_image']['tmp_name']);

                    $tmp = imagecreatetruecolor($width,$height);
                    $transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
                    imagefill($tmp, 0, 0, $transparent);
                    imagealphablending($tmp, true); 

                    imagecopyresampled($tmp, $image,0,0,0,0,$width,$height,$w, $h);
                    imagegif($tmp, $path);
                }
                else
                {
                    return false;
                }

                return true;
                imagedestroy($image);
                imagedestroy($tmp);
        }

6

আমি চিত্র পুনরায় আকার দেওয়ার জন্য একটি সহজেই ব্যবহারযোগ্য লাইব্রেরি তৈরি করেছি। এটি গিথুব-এ পাওয়া যাবে

লাইব্রেরিটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ:

// Include PHP Image Magician library
require_once('php_image_magician.php');

// Open JPG image
$magicianObj = new imageLib('racecar.jpg');

// Resize to best fit then crop (check out the other options)
$magicianObj -> resizeImage(100, 200, 'crop');

// Save resized image as a PNG (or jpg, bmp, etc)
$magicianObj -> saveImage('racecar_small.png');

অন্যান্য বৈশিষ্ট্য, আপনার এগুলি প্রয়োজন হওয়া উচিত:

  • দ্রুত এবং সহজ আকার পরিবর্তন - ল্যান্ডস্কেপ, প্রতিকৃতি বা অটোতে পুনরায় আকার দিন
  • সহজ ফসল
  • টেক্সট যোগ করুন
  • মান সমন্বয়
  • জলছবি
  • ছায়া এবং প্রতিচ্ছবি
  • স্বচ্ছ সমর্থন
  • এক্সিএফ মেটাডেটা পড়ুন
  • সীমানা, বৃত্তাকার কোণ, ঘূর্ণন
  • ফিল্টার এবং প্রভাব
  • চিত্র তীক্ষ্ণ করা হচ্ছে
  • চিত্রের ধরণের রূপান্তর
  • বিএমপি সমর্থন

4
এটি আমার দিনকে বাঁচিয়েছিল। যাইহোক, আমি এমন একজনের কাছে একটি ছোট্ট বিজ্ঞপ্তি পেয়েছি যিনি আমার মতো 3 দিন সন্ধান করছিলেন এবং পুনরায় আকার দেওয়ার কোনও সমাধান খুঁজে পাওয়ার আশা হারাতে চলেছিলেন। ভবিষ্যতে আপনি যদি অপরিজ্ঞাত সূচক বিজ্ঞপ্তিগুলি দেখেন তবে কেবল এই লিঙ্কটি দেখুন: github.com/Oberto/php-image-magician/pull/16/commits এবং ফাইলগুলিতে পরিবর্তনগুলি প্রয়োগ করুন। এটি কোনও সমস্যা ছাড়াই 100% কাজ করবে।
হেমা_এলমাস্রি

4
আরে, @ হিমা_এলমাস্রি। এফওয়াইআই, আমি এই পরিবর্তনগুলিকে সবেমাত্র
জারোদ ২

ঠিক আছে, দুঃখিত, আমি খেয়াল করিনি। তবে আমি একটি প্রশ্ন করেছি। আমি যখন মানের পরিবর্তন না করে একটি ছোট রেজোলিউশনের আকার পরিবর্তন করি তখন প্রদর্শিত চিত্রের গুণমানটি অনেক কম থাকে। এর আগে কি আপনার মতো কিছু ঘটেছে? কারণ আমি এখনও কোনও সমাধান পাইনি।
হেমা_এলমাস্রি 26'19

6

( গুরুত্বপূর্ণ : অ্যানিমেশন (অ্যানিমেটেড ওয়েবপ বা জিআইএফ) আকার পরিবর্তন করার ক্ষেত্রে, ফলাফলটি প্রথম ফ্রেম থেকে একটি অ্যানিমেটেড নয়, তবে পুনরায় আকারযুক্ত চিত্র হবে! (আসল অ্যানিমেশন অক্ষত থাকবে ...)

আমি এটি আমার পিএইচপি .2.২ প্রকল্পে তৈরি করেছি (উদাহরণস্বরূপ ইমেজবিএমপি নিশ্চিত (পিএইচপি>> = .2.২.০): পিডিপি / ম্যানুয়াল / ফাংশন.আইমেজবিএমপি ) জিডি 2 সহ, (তৃতীয় পক্ষের লাইব্রেরি কিছুই নেই) এবং নিকো বিস্তলফির জবাবের সাথে খুব মিল, তবে পাঁচটি মূল চিত্রের মাইমটাইপ ( পিএনজি, জেপেইগ, ওয়েবপিপি, বিএমপি এবং জিআইএফ ) এর সাথে কাজ করে, একটি নতুন পরিবর্তিত ফাইল তৈরি করে, মূলটি পরিবর্তন না করে এবং সমস্ত ফাংশন এক ফাংশনে এবং ব্যবহারের জন্য প্রস্তুত (আপনার প্রকল্পে অনুলিপি করুন এবং আটকান)। (আপনি পঞ্চম প্যারামিটারের সাহায্যে নতুন ফাইলের এক্সটেনশন সেট করতে পারেন বা আপনি যদি অরিগেনাল রাখতে চান তবে কেবল এটি ছেড়ে দিতে পারেন):

function createResizedImage(
    string $imagePath = '',
    string $newPath = '',
    int $newWidth = 0,
    int $newHeight = 0,
    string $outExt = 'DEFAULT'
) : ?string
{
    if (!$newPath or !file_exists ($imagePath)) {
        return null;
    }

    $types = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_BMP, IMAGETYPE_WEBP];
    $type = exif_imagetype ($imagePath);

    if (!in_array ($type, $types)) {
        return null;
    }

    list ($width, $height) = getimagesize ($imagePath);

    $outBool = in_array ($outExt, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']);

    switch ($type) {
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg ($imagePath);
            if (!$outBool) $outExt = 'jpg';
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng ($imagePath);
            if (!$outBool) $outExt = 'png';
            break;
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif ($imagePath);
            if (!$outBool) $outExt = 'gif';
            break;
        case IMAGETYPE_BMP:
            $image = imagecreatefrombmp ($imagePath);
            if (!$outBool) $outExt = 'bmp';
            break;
        case IMAGETYPE_WEBP:
            $image = imagecreatefromwebp ($imagePath);
            if (!$outBool) $outExt = 'webp';
    }

    $newImage = imagecreatetruecolor ($newWidth, $newHeight);

    //TRANSPARENT BACKGROUND
    $color = imagecolorallocatealpha ($newImage, 0, 0, 0, 127); //fill transparent back
    imagefill ($newImage, 0, 0, $color);
    imagesavealpha ($newImage, true);

    //ROUTINE
    imagecopyresampled ($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    // Rotate image on iOS
    if(function_exists('exif_read_data') && $exif = exif_read_data($imagePath, 'IFD0'))
    {
        if(isset($exif['Orientation']) && isset($exif['Make']) && !empty($exif['Orientation']) && preg_match('/(apple|ios|iphone)/i', $exif['Make'])) {
            switch($exif['Orientation']) {
                case 8:
                    if ($width > $height) $newImage = imagerotate($newImage,90,0);
                    break;
                case 3:
                    $newImage = imagerotate($newImage,180,0);
                    break;
                case 6:
                    $newImage = imagerotate($newImage,-90,0);
                    break;
            }
        }
    }

    switch (true) {
        case in_array ($outExt, ['jpg', 'jpeg']): $success = imagejpeg ($newImage, $newPath);
            break;
        case $outExt === 'png': $success = imagepng ($newImage, $newPath);
            break;
        case $outExt === 'gif': $success = imagegif ($newImage, $newPath);
            break;
        case  $outExt === 'bmp': $success = imagebmp ($newImage, $newPath);
            break;
        case  $outExt === 'webp': $success = imagewebp ($newImage, $newPath);
    }

    if (!$success) {
        return null;
    }

    return $newPath;
}

তুমি মহান! এটি সহজ এবং পরিষ্কার সমাধান। আমার ইমেজিক মডিউল নিয়ে সমস্যা ছিল এবং এই সাধারণ শ্রেণীর সাথে সমস্যাগুলি সমাধান করা। ধন্যবাদ!
আইভিজান স্টিফান স্টিপিয়ে

দুর্দান্ত, আপনি যদি চান তবে আমি পরে আরও একটি আপডেট যুক্ত করতে পারি, আমি এটি কিছুটা উন্নতি করব।
আইভিজান স্টিফান স্টিপিয়ি

অবশ্যই! অ্যানিমেশন পুনরায় আকার দেওয়ার অংশটি এখনও তৈরি করতে আমার এখনও সময় পেলাম না ...
ড্যানিগোর

@ উদ্যানগোর, কাঁচা চিত্রগুলি ( .cr2, .dng, .nefএবং পছন্দগুলি) কীভাবে আকার পরিবর্তন করবেন ? জিডি 2 এর কোনও সমর্থন নেই এবং প্রচুর লড়াইয়ের পরে আমি ইমেজম্যাগিক সেটআপ করতে সক্ষম হয়েছি। তবে, ফাইলটি পড়ার সময় এটি সংযোগের সময়সীমা ত্রুটির সাথে ব্যর্থ হয়। এবং, ত্রুটি
লগও

4
@ উদ্যানগোর অ্যাপল সমস্যা সমাধানের জন্য আমি আপনার ফাংশনটিতে স্বয়ংক্রিয় চিত্রের ঘূর্ণন যুক্ত করছি।
আইভিজান স্টিফান স্টিপিয়াস

2

@ ইয়ান আতকিন 'দেওয়া উত্তরের একটি বর্ধিত সংস্করণ এখানে। আমি এটি অত্যন্ত ভাল কাজ পেয়েছি। বৃহত্তর চিত্রের জন্য যে :)। আপনি যদি যত্নশীল না হন তবে আপনি আসলে ছোট চিত্রগুলি আরও বড় করতে পারেন। পরিবর্তনগুলি: - jpg, jpeg, png, gif, bmp ফাইলগুলিকে সমর্থন করে - .png এবং .gif এর জন্য স্বচ্ছতা সংরক্ষণ করে - মূল প্রকৃতির আকারটি ইতিমধ্যে ছোট নয় কিনা - ডাবল চেকগুলি সরাসরি দেওয়া চিত্রটিকে ওভাররাইড করে (এটি আমার যা প্রয়োজন)

সুতরাং এটি এখানে। ফাংশনের ডিফল্ট মানগুলি হ'ল "সোনার নিয়ম"

function resize_image($file, $w = 1200, $h = 741, $crop = false)
   {
       try {
           $ext = pathinfo(storage_path() . $file, PATHINFO_EXTENSION);
           list($width, $height) = getimagesize($file);
           // if the image is smaller we dont resize
           if ($w > $width && $h > $height) {
               return true;
           }
           $r = $width / $height;
           if ($crop) {
               if ($width > $height) {
                   $width = ceil($width - ($width * abs($r - $w / $h)));
               } else {
                   $height = ceil($height - ($height * abs($r - $w / $h)));
               }
               $newwidth = $w;
               $newheight = $h;
           } else {
               if ($w / $h > $r) {
                   $newwidth = $h * $r;
                   $newheight = $h;
               } else {
                   $newheight = $w / $r;
                   $newwidth = $w;
               }
           }
           $dst = imagecreatetruecolor($newwidth, $newheight);

           switch ($ext) {
               case 'jpg':
               case 'jpeg':
                   $src = imagecreatefromjpeg($file);
                   break;
               case 'png':
                   $src = imagecreatefrompng($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'gif':
                   $src = imagecreatefromgif($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'bmp':
                   $src = imagecreatefrombmp($file);
                   break;
               default:
                   throw new Exception('Unsupported image extension found: ' . $ext);
                   break;
           }
           $result = imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
           switch ($ext) {
               case 'bmp':
                   imagewbmp($dst, $file);
                   break;
               case 'gif':
                   imagegif($dst, $file);
                   break;
               case 'jpg':
               case 'jpeg':
                   imagejpeg($dst, $file);
                   break;
               case 'png':
                   imagepng($dst, $file);
                   break;
           }
           return true;
       } catch (Exception $err) {
           // LOG THE ERROR HERE 
           return false;
       }
   }

দানিয়েলডাইনভ - দুর্দান্ত ফাংশন - এটি পোস্ট করার জন্য ধন্যবাদ - তাত্ক্ষণিক প্রশ্ন: কেবলমাত্র প্রস্থটি পাস করার এবং মূল চিত্রের উপর ভিত্তি করে ফাংশনটি তুলনামূলকভাবে উচ্চতা সামঞ্জস্য করার কোনও উপায় আছে? অন্য কথায়, যদি আসলটি 400x200 হয় তবে আমরা কি ফাংশনটি বলতে পারি আমরা নতুন প্রস্থটি 200 হতে চাই এবং ফাংশনটি চিত্রটি বের করে দেই যে উচ্চতা 100 হওয়া উচিত?
marcnyc

আপনার শর্তসাপেক্ষ অভিব্যক্তি সম্পর্কে, আমি মনে করি না যে যদি পুনরায় আকার দেওয়ার কৌশলটি কার্যকর করা যায় তবে তা বোধগম্য হয় $w === $width && $h === $height। চিন্তা করুন. হওয়া উচিত >=এবং >=তুলনা করা উচিত। @ ড্যানিয়েল
মিকম্যাকুসা

1

জেডএফ কেক:

<?php

class FkuController extends Zend_Controller_Action {

  var $image;
  var $image_type;

  public function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {

    $target_dir = APPLICATION_PATH  . "/../public/1/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);

    //$image = new SimpleImage();
    $this->load($_FILES[$html_element_name]['tmp_name']);
    $this->resize($new_img_width, $new_img_height);
    $this->save($target_file);
    return $target_file; 
    //return name of saved file in case you want to store it in you database or show confirmation message to user



  public function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }
  public function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image,$filename);
      }
      if( $permissions != null) {

         chmod($filename,$permissions);
      }
   }
  public function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }
  public function getWidth() {

      return imagesx($this->image);
   }
  public function getHeight() {

      return imagesy($this->image);
   }
  public function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

  public function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

  public function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

  public function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }

  public function savepicAction() {
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    $this->_response->setHeader('Access-Control-Allow-Origin', '*');

    $this->db = Application_Model_Db::db_load();        
    $ouser = $_POST['ousername'];


      $fdata = 'empty';
      if (isset($_FILES['picture']) && $_FILES['picture']['size'] > 0) {
        $file_size = $_FILES['picture']['size'];
        $tmpName  = $_FILES['picture']['tmp_name'];  

        //Determine filetype
        switch ($_FILES['picture']['type']) {
            case 'image/jpeg': $ext = "jpg"; break;
            case 'image/png': $ext = "png"; break;
            case 'image/jpg': $ext = "jpg"; break;
            case 'image/bmp': $ext = "bmp"; break;
            case 'image/gif': $ext = "gif"; break;
            default: $ext = ''; break;
        }

        if($ext) {
          //if($file_size<400000) {  
            $img = $this->store_uploaded_image('picture', 90,82);
            //$fp      = fopen($tmpName, 'r');
            $fp = fopen($img, 'r');
            $fdata = fread($fp, filesize($tmpName));        
            $fdata = base64_encode($fdata);
            fclose($fp);

          //}
        }

      }

      if($fdata=='empty'){

      }
      else {
        $this->db->update('users', 
          array(
            'picture' => $fdata,             
          ), 
          array('username=?' => $ouser ));        
      }



  }  

1

এই কাজটি করার জন্য আমি একটি গাণিতিক উপায় পেয়েছি

গিথুব রেপো - https://github.com/gayanSandamal/easy-php-image-resizer

সরাসরি উদাহরণ - https://plugins.nayague.com/easy-php-image-resizer/

<?php
//path for the image
$source_url = '2018-04-01-1522613288.PNG';

//separate the file name and the extention
$source_url_parts = pathinfo($source_url);
$filename = $source_url_parts['filename'];
$extension = $source_url_parts['extension'];

//define the quality from 1 to 100
$quality = 10;

//detect the width and the height of original image
list($width, $height) = getimagesize($source_url);
$width;
$height;

//define any width that you want as the output. mine is 200px.
$after_width = 200;

//resize only when the original image is larger than expected with.
//this helps you to avoid from unwanted resizing.
if ($width > $after_width) {

    //get the reduced width
    $reduced_width = ($width - $after_width);
    //now convert the reduced width to a percentage and round it to 2 decimal places
    $reduced_radio = round(($reduced_width / $width) * 100, 2);

    //ALL GOOD! let's reduce the same percentage from the height and round it to 2 decimal places
    $reduced_height = round(($height / 100) * $reduced_radio, 2);
    //reduce the calculated height from the original height
    $after_height = $height - $reduced_height;

    //Now detect the file extension
    //if the file extension is 'jpg', 'jpeg', 'JPG' or 'JPEG'
    if ($extension == 'jpg' || $extension == 'jpeg' || $extension == 'JPG' || $extension == 'JPEG') {
        //then return the image as a jpeg image for the next step
        $img = imagecreatefromjpeg($source_url);
    } elseif ($extension == 'png' || $extension == 'PNG') {
        //then return the image as a png image for the next step
        $img = imagecreatefrompng($source_url);
    } else {
        //show an error message if the file extension is not available
        echo 'image extension is not supporting';
    }

    //HERE YOU GO :)
    //Let's do the resize thing
    //imagescale([returned image], [width of the resized image], [height of the resized image], [quality of the resized image]);
    $imgResized = imagescale($img, $after_width, $after_height, $quality);

    //now save the resized image with a suffix called "-resized" and with its extension. 
    imagejpeg($imgResized, $filename . '-resized.'.$extension);

    //Finally frees any memory associated with image
    //**NOTE THAT THIS WONT DELETE THE IMAGE
    imagedestroy($img);
    imagedestroy($imgResized);
}
?>

0

আপনি TinyPNG পিএইচপি লাইব্রেরিতে চেষ্টা করে দেখতে পারেন। এই লাইব্রেরিটি ব্যবহার করে পুনরায় আকার দেওয়ার প্রক্রিয়া চলাকালীন আপনার চিত্র স্বয়ংক্রিয়ভাবে অনুকূলিত হবে। আপনার সমস্ত গ্রন্থাগারটি ইনস্টল করতে হবে এবং https://tinypng.com/developers থেকে একটি API কী পান । একটি লাইব্রেরি ইনস্টল করতে, নীচের কমান্ডটি চালান।

composer require tinify/tinify

এর পরে আপনার কোডটি নিম্নরূপ।

require_once("vendor/autoload.php");

\Tinify\setKey("YOUR_API_KEY");

$source = \Tinify\fromFile("large.jpg"); //image to be resize
$resized = $source->resize(array(
    "method" => "fit",
    "width" => 150,
    "height" => 100
));
$resized->toFile("thumbnail.jpg"); //resized image

আমার একই বিষয়ে একটি লিখিত ব্লগ আছে http://artisansweb.net/resize-image-php- using-tinypng


0

আমি একটি সহজ উপায় প্রস্তাব করব:

function resize($file, $width, $height) {
    switch(pathinfo($file)['extension']) {
        case "png": return imagepng(imagescale(imagecreatefrompng($file), $width, $height), $file);
        case "gif": return imagegif(imagescale(imagecreatefromgif($file), $width, $height), $file);
        default : return imagejpeg(imagescale(imagecreatefromjpeg($file), $width, $height), $file);
    }
}

0
private function getTempImage($url, $tempName){
  $tempPath = 'tempFilePath' . $tempName . '.png';
  $source_image = imagecreatefrompng($url); // check type depending on your necessities.
  $source_imagex = imagesx($source_image);
  $source_imagey = imagesy($source_image);
  $dest_imagex = 861; // My default value
  $dest_imagey = 96;  // My default value

  $dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

  imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

  imagejpeg($dest_image, $tempPath, 100);

  return $tempPath;

}

এই দুর্দান্ত ব্যাখ্যাটির ভিত্তিতে এটি একটি অভিযোজিত সমাধান । এই লোকটি ধাপে ধাপে ব্যাখ্যা করেছেন। আশা করি সকলেই এটি উপভোগ করবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.