PHP'de resmi yeniden boyutlandırma


96

Bir form aracılığıyla yüklenen herhangi bir resmi otomatik olarak 147x147px boyutuna yeniden boyutlandıran bazı PHP kodu yazmak istiyorum, ancak bunun nasıl yapılacağı hakkında hiçbir fikrim yok (göreceli bir PHP acemisiyim).

Şimdiye kadar, başarıyla yüklenen resimlerim var, dosya türleri tanınıyor ve adlar temizleniyor, ancak yeniden boyutlandırma işlevini koda eklemek istiyorum. Örneğin, 2.3MB boyutunda ve 1331x1331 boyutunda bir test resmim var ve kodun onu küçültmesini istiyorum, sanırım resmin boyutunu da önemli ölçüde sıkıştıracaktır.

Şimdiye kadar aşağıdakilere sahibim:

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);


upload_max_filesizegirişi değiştirmeden php.ini, öncelikle boyutu upload_max_filesize? dan büyük olan dosyayı yüklemek mümkün müdür ? Görüntüyü boyutundan daha fazla yeniden boyutlandırma şansı var mı upload_max_filesize? değiştirmeden upload_max_filesizeiçindephp.ini
RCH

Yanıtlar:


143

Resimlerle çalışmak için PHP'nin ImageMagick veya GD işlevlerini kullanmanız gerekir .

Örneğin GD ile bu kadar basit ...

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;
}

Ve bu işlevi şöyle adlandırabilirsiniz ...

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

Kişisel deneyimlerden, GD'nin görüntü yeniden örneklemesi, özellikle ham dijital kamera görüntülerini yeniden örneklerken dosya boyutunu da önemli ölçüde azaltır.


1
Görüntüleri BLOBs olarak mı depoluyorsunuz ? Dosyaları dosya sisteminde depolamanızı ve veritabanınıza referanslar eklemenizi öneririm. Ayrıca, başka hangi seçeneklere sahip olduğunuzu görmek için tam GD (veya ImageMagick) belgelerini okumanızı tavsiye ederim.
Ian Atkin 13

20
Bu çözümün yalnızca JPEG'ler için çalıştığını unutmayın. İmagecreatefromjpeg'i şunlardan herhangi biriyle değiştirebilirsiniz: imagecreatefromgd, imagecreatefromgif, imagecreatefrompng, imagecreatefromstring, imagecreatefromwbmp, imagecreatefromxbm, imagecreatefromxpm ile farklı görüntü türleriyle başa çıkabilirsiniz.
Chris Hanson 13

2
@GordonFreeman Harika kod parçacığı için teşekkürler, ancak orada bir aksaklık var, yükseklik kısmına abs()benzer ceil($width-($width*abs($r-$w/$h)))ve aynı şeyi ekleyin . Bazı durumlarda gereklidir.
Arman P.

1
Varsayılan kırpma değerini true olarak değiştirmek ve görüntünün http://wallpapercave.com/wp/wc1701171.jpg400x128 (başlık) olarak yeniden boyutlandırılması siyah bir görüntü oluşturdu; Yine de neden bunu yaptığını anlayamıyorum.
FoxInFlame

5
Yeniden boyutlandırılan görüntüyü dosya sistemine kaydetmek imagejpeg($dst, $file);için imagecopyresampled($dst,...satırdan sonra ekleyin . Değişim $fileOrijinal üzerine yazmak istemiyorsanız.
wkille

23

Bu kaynak (bozuk bağlantı) da dikkate değer - GD kullanan oldukça düzenli bir kod. Ancak, OP'lerin gereksinimlerini karşılayan bu işlevi oluşturmak için son kod parçalarını değiştirdim ...

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
    
}

Bu PHP dosyasını da eklemeniz gerekecek ...

<?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;
   }      
 
}
?>

1
Örneğiniz en iyisidir. Komedi, drama, saç çekme yapmadan doğrudan Zend çerçevesinde çalışır. başparmak yukarı

Bence ihtiyacınız olan tüm kod cevabımda olmalı, ancak bu da yardımcı olabilir: gist.github.com/arrowmedia/7863973 .
ban-jeomühendislik

20

Basit Kullanım PHP işlevi (görüntü ölçeği ):

Sözdizimi:

imagescale ( $image , $new_width , $new_height )

Misal:

Adım: 1 Dosyayı okuyun

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

Adım: 2: Görüntü Dosyasını Yükleyin

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

Adım 3: Hayat Kurtarıcımız '_' ile geliyor | Görüntüyü ölçeklendirin

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

Not: görüntü ölçeği (PHP 5> = 5.5.0, PHP 7) için çalışır

Kaynak: Devamını okumak için tıklayın


PHP 5.6.3 için en iyi çözüm>
Pattycake Jr

12

En boy oranını önemsemiyorsanız (yani, resmi belirli bir boyuta zorlamak istiyorsanız), işte basitleştirilmiş bir cevap

// 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;
}

Şimdi yükleme kısmını halledelim. İlk adım, dosyayı istediğiniz dizine yükleyin. Daha sonra dosya türüne (jpg, png veya gif) bağlı olarak yukarıdaki işlevlerden biri olarak adlandırılır ve yüklediğiniz dosyanın mutlak yolunu aşağıdaki gibi iletir:

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

Dönüş değeri $imgbir kaynak nesnesidir. Aşağıdaki gibi yeni bir konuma kaydedebilir veya orijinali geçersiz kılabiliriz:

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

Umarım bu birine yardımcı olur. Imagick :: resizeImage ve imagejpeg () yeniden boyutlandırma hakkında daha fazla bilgi için bu bağlantıları kontrol edin


upload_max_filesizegirişi değiştirmeden php.ini, öncelikle boyuttan büyük dosyayı yükleyemezsiniz upload_max_filesize. Birden fazla boyutta görüntüyü yeniden boyutlandırmak için şansımız var mı upload_max_filesizedeğiştirmeden upload_max_filesizeiçindephp.ini
RCH

6

Umarım sizin için çalışacaktır.

/**
         * 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

Görüntüyü yeniden boyutlandırmak için kullanımı kolay bir kitaplık oluşturdum. Bu bulunabilir Github burada .

Kitaplığın nasıl kullanılacağına dair bir örnek:

// 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');

İhtiyacınız olursa diğer özellikler şunlardır:

  • Hızlı ve kolay yeniden boyutlandırma - Yatay, dikey veya otomatik olarak yeniden boyutlandırın
  • Kolay kırpma
  • Yazı ekle
  • Kalite ayarı
  • Filigran
  • Gölgeler ve yansımalar
  • Şeffaflık desteği
  • EXIF meta verilerini okuyun
  • Kenarlıklar, Yuvarlatılmış köşeler, Döndürme
  • Filtreler ve efektler
  • Görüntü keskinleştirme
  • Görüntü türü dönüştürme
  • BMP desteği

1
Bu günümü kurtardı. Ancak, benim gibi 3 gündür arayan ve herhangi bir yeniden boyutlandırma çözümü bulma umudunu kaybetmek üzere olan birine küçük bir bildirim var. İleride tanımlanmamış dizin bildirimleri görürseniz, şu bağlantıya bakın: github.com/Oberto/php-image-magician/pull/16/commits Ve değişiklikleri dosyalara uygulayın. Sorunsuz bir şekilde% 100 çalışacaktır.
Hema_Elmasry

2
Merhaba @Hema_Elmasry. Bilginize, bu değişiklikleri ana ile birleştirdim :)
Jarrod

Tamam, üzgünüm, fark etmedim. Ama bir sorum var. Kalitesi değişmeden daha küçük bir çözünürlüğe yeniden boyutlandırdığımda, görüntülenen görüntü kalitesi çok daha düşük oluyor. Daha önce sana benzer bir şey oldu mu? Çünkü hala bir çözüm bulamadım.
Hema_Elmasry

6

( ÖNEMLİ : Animasyonun (animasyonlu webp veya gif) yeniden boyutlandırılması durumunda, sonuç canlandırılmamış ancak ilk kareden yeniden boyutlandırılmış bir görüntü olacaktır! (Orijinal animasyon bozulmadan kalır ...)

Bunu php 7.2 projem için oluşturdum (örnek imagebmp sure (PHP 7> = 7.2.0): php / manual / function.imagebmp ) techfry.com/php-tutorial hakkında GD2 ile (yani 3. parti kitaplığı yok) ve Nico Bistolfi'nin cevabına çok benzer, ancak beş temel görüntü mimetipinin ( png, jpeg, webp, bmp ve gif ) tümü ile çalışır , orijinali değiştirmeden yeni bir yeniden boyutlandırılmış dosya oluşturur ve tek bir işlevdeki tüm şeyler ve kullanıma hazır (projenize kopyalayıp yapıştırın). (Yeni dosyanın uzantısını beşinci parametre ile ayarlayabilir veya orijinali korumak istiyorsanız bırakabilirsiniz):

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;
}

Harikasın! Bu basit ve temiz bir çözümdür. Imagick modülüyle sorun yaşadım ve bu basit sınıfla sorunları çözdüm. Teşekkürler!
Ivijan Stefan Stipić

Harika, istersen daha sonra başka bir güncelleme ekleyebilirim, bunu biraz geliştiririm.
Ivijan Stefan Stipić

Elbette! Animasyonu yeniden boyutlandırma bölümünü oluşturmak için hâlâ zamanım yok ...
danigore

@danigore, ham görüntüler ( .cr2, .dng, .nefve beğeniler) nasıl yeniden boyutlandırılır ? GD2'nin herhangi bir desteği yok ve çok uğraştıktan sonra ImageMagick'i kurmayı başardım. Ancak, dosyayı okurken bağlantı zaman aşımı hatasıyla başarısız olur. Ve hata kaydı da yok ..
Krishna Chebrolu

1
@danigore Apple sorunlarını çözmek için işlevinize otomatik görüntü döndürme özelliğini ekliyorum.
Ivijan Stefan Stipić

2

İşte @ Ian Atkin'in verdiği cevabın genişletilmiş versiyonu. Son derece iyi çalıştığını buldum. Daha büyük resimler için :). Dikkatli olmazsanız, aslında daha küçük resimleri daha büyük yapabilirsiniz. Değişiklikler: - jpg, jpeg, png, gif, bmp dosyalarını destekler - .png ve .gif için şeffaflığı korur - Orijinalin boyutunun daha küçük olup olmadığını iki kez kontrol eder - Doğrudan verilen görüntüyü geçersiz kılar (ihtiyacım olan şey)

İşte burada. İşlevin varsayılan değerleri "altın kural" dır

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;
       }
   }

Harika işlev @DanielDoinov - gönderdiğiniz için teşekkürler - hızlı soru: Yalnızca genişliği geçmenin ve işlevin orijinal görüntüye göre yüksekliği nispeten ayarlamasına izin vermenin bir yolu var mı? Başka bir deyişle, orijinal 400x200 ise, yeni genişliğin 200 olmasını istediğimiz fonksiyona söyleyip yüksekliğin 100 olması gerektiğini fonksiyonun anlamasına izin verebilir miyiz?
marcnyc

Koşullu ifadenizle ilgili olarak, yeniden boyutlandırma tekniğini uygulamanın mantıklı olduğunu düşünmüyorum $w === $width && $h === $height. Bunu düşün. Olmalı >=ve >=karşılaştırmalar. @Daniel
mickmackusa

1

ZF pastası:

<?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

Bu işi halletmenin matematiksel bir yolunu buldum

Github deposu - https://github.com/gayanSandamal/easy-php-image-resizer

Canlı örnek - 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 PHP kitaplığını deneyebilirsiniz. Bu kitaplığı kullanarak resminiz yeniden boyutlandırma işlemi sırasında otomatik olarak optimize edilir. Kitaplığı kurmak ve https://tinypng.com/developers adresinden bir API anahtarı almak için ihtiyacınız olan her şey . Bir kitaplık kurmak için aşağıdaki komutu çalıştırın.

composer require tinify/tinify

Bundan sonra kodunuz aşağıdaki gibidir.

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

Aynı konu üzerine bir blog yazdım http://artisansweb.net/resize-image-php-using-tinypng


0

Kolay bir yol öneririm:

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;

}

Bu, bu harika açıklamaya dayanan uyarlanmış bir çözümdür . Bu adam adım adım açıklama yaptı. Umarım herkes beğenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.