PHPを使用してイメージのサイズを変更する

私はアスペクト比を維持しながら、300x300ピクセルの正方形に収まるようにイメージのサイズを変更するためのきちんとした小さなPHPスクリプトを使用しています。 ここからスクリプトを入手しました。

ここにスクリプト全体があります:

<?php

/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.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;
   }      

}
?>

私はそれをどのように使用しているのです:

    $image = new SimpleImage();
    $image->load($_FILES['uploaded_image']['tmp_name']);
    $image->resizeToWidth(300);
    $image->resizeToHeight(300);
    $image->save('./images/photo'.$id.'.jpg');
    header("Location: people.php");
    exit;

And here's my problem: It only resizes the height. So if I gave it a 1200x990 (width x height) image, it spits out a 400x300 (if that makes sense), which is does not fit within my 300x300 square.

私も試みた:

    $image = new SimpleImage();
    $image2 = new SimpleImage();
    $image->load($_FILES['uploaded_image']['tmp_name']);
    $image->resizeToWidth(300);
    $image->save('temp.jpg');
    $image2->load('temp.jpg');
    $image2->resizeToHeight(300);
    $image2->save('./images/photo'.$id.'.jpg');
    unlink('temp.jpg');
    header("Location: people.php");
    exit;

恐ろしいコードを残念に残してしまったので、私が移動したりシャットダウンしてしまった場所のためだけに、ソースを入れる方が良いと思いました。

そこに敬虔なコーダーがいますか?

4

7 答え

それは正しく動作しています - それは300の高さにサイズ変更され、縦横比(この場合、幅400を作る)を維持します。どの側面が最も大きいか(より正確には、必要な縦横比から最も遠い側)を最初に確認してから、1つの関数(resizeToWidth()またはresizeToHeight())のみを呼び出す必要があります。

そのクラスを使用しなければならない場合、これはうまくいくと思います:

$image = new SimpleImage();
$size = getImageSize($_FILES['uploaded_image']['tmp_name']);
if ($size[0] > 300) {
    $image->load($_FILES['uploaded_image']['tmp_name']);
    $image->resizeToWidth(300);
    $image->save('./images/photo'.$id.'.jpg');
} else {
    move_uploaded_file($_FILES['uploaded_image']['tmp_name'], './images/photo'.$id.'.jpg');
}

$size = getImageSize('./images/photo'.$id.'.jpg');
if ($size[1] > 300) {
    $image->load('./images/photo'.$id.'.jpg');
    $image->resizeToHeight(300);
    $image->save('./images/photo'.$id.'.jpg');
}

header("Location: people.php");
exit;
3
追加された
100%えほん、ありがとう!
追加された 著者 JoeRocc,
いいえ、どいたしまして。ちょっと醜いです。ファイルを画像ディレクトリに移動してからコードを少しきちんと整えることが考えられるかもしれません。
追加された 著者 Grim...,

imagescale()を使用すると、 PHPの 5.5.0 から入手可能な を使用して、イメージのサイズ変更/スケーリングのプロセスを簡略化します。

そのような...

$imgresource = imagecreatefromjpeg("pathtoyourimage.jpg");
imagescale($imgresource, 500, 900, IMG_BICUBIC);
2
追加された

fitToSquare関数をSimpleImageクラスに追加すると、この関数はソースイメージのx座標とy座標を計算し、四角形としてクロップします。私は私の機能をテストしていない:)しかし、それは大丈夫と思われる。

   function fitToSquare($width) {
      $new_image = imagecreatetruecolor($width, $height);

      $sourceX = 0;
      $sourceY = 0;

      if($this->getWidth() > $this->getHeight())
      {
          $sourceX = ($this->getWidth() - $this->getHeight())/2;
      }
      else
      {
          $sourceY = ($this->getHeight() - $this->getWidth())/2;
      }

      imagecopyresampled($new_image, $this->image, 0, 0, $sourceX, $sourceY, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }  
1
追加された
ありがとうadenizc!私はいくつかのエラーがあるので、これを使用して終了しませんでした(これはおそらく些細なことですが、私はPHPクラスではあまりよくありません)
追加された 著者 JoeRocc,
私はこれを修正し、答えとして追加しました。
追加された 著者 Hawkee,
        function imageResize($filename, $dest, $ndest,$filetempname,$filename) {
        $userfile_name = (isset($filename) ? $filename : "");

        $mb_byte_2 = (1024 * 2 * 1000);            
        $ftmp = $filetempname;

        $oname = $filename;
        $fname = $dest;
        $sizes = getimagesize($ftmp);
        $width = $sizes[0];
        $height = $sizes[1];

        $extenssion = strstr($oname, ".");

        $prod_img = $fname;
        $prod_img_thumb =$ndest;
        move_uploaded_file($ftmp, $prod_img);
        $original_filesize = (filesize($prod_img)/1024);
        $sizes = getimagesize($prod_img);

        $expected_max_width = 125;
        $expected_max_height = 100;
        $originalw = $sizes[0];
        $originalh = $sizes[1];

        if ($originalh < $expected_max_height) {
            if ($originalw < $expected_max_width) {
                $imgwidth = $originalw;
                $imgheight = $originalh;
            } else {
                $imgheight = ($expected_max_width * $originalh)/$originalw;
                $imgwidth = $expected_max_width;
            }
        } else {
            $new_height = $expected_max_height;
            $new_width = ($expected_max_height * $originalw)/$originalh;

            if ($new_width > $expected_max_width) {
                $new_height = ($expected_max_width * $expected_max_height)/$new_width;
                $new_width = $expected_max_width;
            }

            $imgwidth = $new_width;
            $imgheight = $new_height;
        }
        $new_h = $imgheight;
        $new_w = $imgwidth;
        $new_w_im = '125';
        $new_h_im = '100';
        $offsetwidth = $new_w_im - $new_w;
        $offsetw = $offsetwidth/2;
        $offsetheight = $new_h_im - $new_h;
        $offseth = $offsetheight/2;
       // echo $extenssion;
        $dest = imagecreatetruecolor($new_w_im, $new_h_im);
        $bg = imagecolorallocate($dest, 255, 255, 255);
        imagefill($dest, 0, 0, $bg);

        if ($extenssion == '.jpg') {
            $src = imagecreatefromjpeg($prod_img)
                    or die('Problem In opening Source JPG Image');
        } elseif ($extenssion == '.jpeg') {
            $src = imagecreatefromjpeg($prod_img)
                    or die('Problem In opening Source JPEG Image');
        } elseif ($extenssion == '.gif') {
            $src = imagecreatefromgif($prod_img)
                    or die('Problem In opening Source GIF Image');
        } elseif ($extenssion == '.png') {
            $src = imagecreatefrompng($prod_img)
                    or die('Problem In opening Source PNG Image');
        } elseif ($extenssion == '.bmp') {
            //print_r($prod_img);
         //               $src = imagecreatefrombmp($prod_img)
        //               or die('Problem In opening Source BMP Image');
        }

        if (function_exists('imagecopyresampled')) {
            imagecopyresampled($dest, $src, $offsetw, $offseth, 0, 0, 
             $new_w, $new_h,   imagesx($src), imagesy($src))
                    or die('Problem In resizing');
        } else {
            Imagecopyresized($dest, $src, $offsetw, $offseth, 0, 0,  
            $new_w, $new_h, imagesx($src), imagesy($src))
                    or die('Problem In resizing');
        }
        imagejpeg($dest, $prod_img_thumb, 72)
                or die('Problem In saving');
        imagedestroy($dest);
        @ob_flush();
        $new_filesize = (filesize($prod_img)/1024);
    }
1
追加された
あなたの答えにいくつかのコメントを追加してください。どのように機能するのですか?あなたのアルゴリズムの流れは?
追加された 著者 Yaroslav,

@adenizcによって投稿された機能を修正し、SimpleImageライブラリにプルリクエストを作成しました。ここに関数があります:

/**
     * Square crop 
     *
     * This function crops the image to fit the given size which is both the width and the height
     *
     * @param int   $size
     *
     * @return SimpleImage
     */

    function square($size) {
        $new = imagecreatetruecolor($size, $size);

        $sourceX = 0;
        $sourceY = 0;

        if($this->width > $this->height) {
            $this->fit_to_height($size);
            $sourceX = ($this->width - $size)/2;
        }
        else {
            $this->fit_to_width($size);
            $sourceY = ($this->height - $size)/2;
        }

        imagealphablending($new, false);
        imagesavealpha($new, true);
        imagecopy($new, $this->image, 0, 0, $sourceX, $sourceY, $size, $size);
        $this->image = $new;

        return $this;
    }
0
追加された

それはあなたに問題を与えている場合は、それをバックドアすることができます。クラスに比率を計算させる代わりに、resize関数に直接行ってください。

     $image = new SimpleImage();
     $image->load($_FILES['uploaded_image']['tmp_name']);     
     $image->resize(300, 300);
     $image->save('./images/photo'.$id.'.jpg');
     header("Location: people.php");
     exit; 
0
追加された
しかし、アスペクト比は維持されません。
追加された 著者 Grim...,

あなたはresizetowidthを行い、その後は高さを測ることはできません。
実際には363x300にサイズ変更されます。
アスペクト比を保持する新しい関数を作成する:

function scale_kar($maxwidth,$maxheight) { 
  $width = $this->getWidth();
  $height = $this->getheight();
  if($width > $height) {
          $ratio = $maxwidth/$width;
          $height = $height * $ratio;
          $this->resize($maxwidth,$height);
  }
  if($width < $height) {
          $ratio = $maxheight/$height;
          $width = $width * $ratio;
          $this->resize($width,$maxheight);
  }
}

次にそれを呼び出す:

 $image->scale_kar(300,300); 
0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com