• ベストアンサー

PHPのimagecreatefromjpeg()

お世話になります。 今自分が作っている、画像のサムネイルを発生させるプログラムで、上記タイトルのimagecreatefromjpeg()関数が未定義であるとのメッセージが以下のように出てきます。 Call to undefined function PhpSolutions\Image\imagecreatefromjpeg() この関数はPHPのビルトインですので、名前空間も無関係のはずですし、未定義という事の意味が分かりません。 以下にクラスThumbnail の定義と、それを使うアプリケーション create_thumb.php を添付します。ここに入り切らない部分は捕捉に添付しておきます。どこが原因でこうなるのかをご指摘いただける方がいらっしゃいましたら、どうかよろしくご教授ください。 <?php namespace PhpSolutions\Image; class Thumbnail{ protected $original; protected $originalheight; protected $originalwidth; protected $basename; protected $maxSize = 120; protected $destination; protected $suffix = '_thb'; protected $messages = []; protected $imageType; public function __construct($image, $destination, $maxSize = 120, $suffix='_thb'){ if(is_file($image) && is_readable($image)){ $details = getimagesize($image); }else{ throw new \Exception("cannot open $image"); } if(!is_array($details)){ throw new \Exception("$image doesn't appear to be an image."); }else { if($details[0] == 0){ // width of image throw new \Exception("cannot determin the size of $image."); } // check the MIME type if(!$this->checkType($details['mime'])){ // mime type of image throw new \Exception("cannot process that type of file."); } $this->original = $image; $this->originalwidth = $details[0]; $this->originalheight = $details[1]; $this->basename = pathinfo($image, PATHINFO_FILENAME); $this->setDestination($destination); $this->setMaxSize($maxSize); $this->setSuffix($suffix); } }// construct public function create(){ $ratio = $this->calculateRatio($this->originalwidth, $this->originalheight, $this->maxSize); $thumbwidth = round($this->originalwidth * $ratio); $thumbheight = round($this->originalheight * $ratio); $resource = $this->createImageResource(); $thumb = imagecreatetruecolor($thumbwidth. $thumbheight); //create thumbnail imagecopyresampled($thumb, $resource, 0,0,0,0, $thumbwidth, $thumbheight,$this->originalwidth, $this->originalheight); $newname = $this->basename.$this->suffix; switch ($this->imageType){ case 'jpeg': $newname .= '.jpg'; $success = imagejpeg($thumb, $this->destination, $newname); break; case 'png': $newname .= '.png'; $success = imagepng($thumb, $this->destination, $newname); break; case 'gif': $newname .= '.gif'; $success = imagegif($thumb, $this->destination, $newname); break; case 'webp': $newname .= '.webp'; $success = imagewebp($thumb, $this->destination, $newname); break; } if($success){ $this->message[] = "$newname created successfully."; }else{ $this->message[] = "Couldn't create thumbnail for basename($this->original)"; } imagedestroy($resource); imagedestroy($thumb); }

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率72% (424/583)
回答No.3

WindowsのXAMPPで下記の情報がありますが、関係ありますかね? https://qiita.com/N0S0/items/5d86f94253f54c53c75f >Windows では、php_gd2.dll の名前が、php_gd.dll に変更されました。

papashiroSooke
質問者

お礼

早速にご回答いただき、有難うございました。自分のphp.ini ではEXTENSION=gd となってましたが、頭に;がついたままでインネーブルされてませんでした。;を外し、Xampp を再起動したら目的のサムネイルを作ることができた。

Powered by GRATICA

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.2

> これを別途インストールしないと使えないのでしょか? imagecreatefromjpeg() は PHP のGD拡張機能に実装された関数で、素のPHPでは利用できません。 > 以前はそのようなことを意識せずにグラフィック関係の関数を使っていたように記憶していますが。 標準関数として使えるモノと、拡張機能をインストールしないと使えないモノがあります。 また、インストール環境によっては拡張機能を有効にしてPHPをインストールしてある場合もあり、どの機能が有効になっているかは確認が必要ですし、使おうとしている関数がどの拡張機能や外部ライブラリーを必要としているのか確認しましょう。

papashiroSooke
質問者

お礼

わかりました。 どこまで自分で確認できるかわかりませんが、確認の上、必要なものをダウンロードしてみます。

Powered by GRATICA
  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.1

PHP-GD はインストールされていますか。

papashiroSooke
質問者

お礼

早速にご回答いただき、有難うございます。 PHPはXamppから使っており、PHP-GDというものがインストールされているかどうかを確認したことはありません。 これを別途インストールしないと使えないのでしょか? 以前はそのようなことを意識せずにグラフィック関係の関数を使っていたように記憶していますが。 一応送る予定で送れなかったソースコードをここに張り付けておきます。 クラス Thumbnail の定義の続きです。 protected function checkType($mime){ $mimeTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; if(in_array($mime, $mimeTypes)){ // extract the character after '/' $this->imageType = substr($mime, strpos($mime, '/')+1); return true; } return false; } protected function setDestination($destination){ if( is_dir($destination) && is_writable($destination)){ $this->destination = rtrim($destination, '/\\').DIRECTORY_SEPARATOR; }else{ throw new \Exception("Cannot write to $destination."); } } protected function setMaxSize($size){ if(is_numeric($size) && $size>0){ $this->maxSize = abs($size); }else{ throw new \Exception("Value for setMaxSize() must be positive number."); } } protected function setSuffix($suffix){ if(preg_match('/^\w+$/', $suffix)){ // pattern ^\w+$ means all the characters are // either alphanumeric or underscore from beginning to end // for preg_match(), the pattern must be enclosed in / and / if(strpos($suffix, '_') !== 0){ $this->suffix = '_'.$suffix; }else{ $this->suffix = $suffix; } } } protected function calculateRatio($width, $height, $maxSize){ if($width <= $maxSize && $height <= $maxSize){ return 1; // no size change }elseif($width > $height){ return $maxSize/$width; }else{ return $maxSize/$height; } } protected function createImageResource(){ switch ($this->imageType){ case 'jpeg': return imagecreatefromjpeg($this->original); case 'png': return imagecreatefrompng($this->original); case 'gif': return imagecreatefromgif($this->original); case 'webp': return imagecreatefromwebp($this->original); } } public function getMessages(){ return $this->messages; } } // class ここからはアプリケーション create_thumb.php です。 <?php use PhpSolutions\Image\Thumbnail; if(isset($_POST['create'])){ require_once '../PhpSolutions/Image/Thumbnail.php'; try{ $thumb = new Thumbnail(trim($_POST['pix']), "C:/upload_test/thumbs", 150, "thm"); $thumb->create(); $messages = $thumb->getMessages(); } catch(Throwable $t){ echo $t->getMessage(); } } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>create thumbnail images</title> </head> <body> <?php if(!empty($messages)){ echo "<ul>"; foreach($messages as $message){ echo "<li> $message</li>"; } echo "</ul>"; } ?> <form method="post" action="create_thumb.php"> <p> <select name="pix" id="pix"> <option value="">Select an image</option> <?php $files = new FilesystemIterator('../images'); $images = new RegexIterator($files, '/\.(jpg|png|gif|webp)$/i'); foreach($images as $image){ ?> <option value="<?= $image->getRealPath() ?> "> <?= $image->getFilename() ?> </option> <?php } ?> </select> </p> <p> <input type="submit" name="create" value="create thumbnail"> </p> </form> </body> </html>

関連するQ&A