2008-08-22 4 views
9

アバタータイプの画像をさまざまな形式(GIF、JPEG、およびPNGは少なくとも)でアップロードできますが、すべてをPNGデータベースのBLOBとして保存することを許可します。イメージがピクセル単位で大きすぎる場合は、DB挿入の前にサイズを変更します。GDを使用してアップロードした画像をサイズ変更してPNGに変換するにはどうすればよいですか?

GDを使用してサイズ変更とPNG変換を行う最良の方法は何ですか?

編集:悲しいことに、使用するサーバーではGDしか利用できません。ImageMagickはありません。

+0

DBとの間で画像を送受信したり、画像を保存したりしないでください。 – dlamblin

答えて

23
<?php            
/* 
Resizes an image and converts it to PNG returning the PNG data as a string 
*/ 
function imageToPng($srcFile, $maxSize = 100) { 
    list($width_orig, $height_orig, $type) = getimagesize($srcFile);   

    // Get the aspect ratio 
    $ratio_orig = $width_orig/$height_orig; 

    $width = $maxSize; 
    $height = $maxSize; 

    // resize to height (orig is portrait) 
    if ($ratio_orig < 1) { 
     $width = $height * $ratio_orig; 
    } 
    // resize to width (orig is landscape) 
    else { 
     $height = $width/$ratio_orig; 
    } 

    // Temporarily increase the memory limit to allow for larger images 
    ini_set('memory_limit', '32M'); 

    switch ($type) 
    { 
     case IMAGETYPE_GIF: 
      $image = imagecreatefromgif($srcFile); 
      break; 
     case IMAGETYPE_JPEG: 
      $image = imagecreatefromjpeg($srcFile); 
      break; 
     case IMAGETYPE_PNG: 
      $image = imagecreatefrompng($srcFile); 
      break; 
     default: 
      throw new Exception('Unrecognized image type ' . $type); 
    } 

    // create a new blank image 
    $newImage = imagecreatetruecolor($width, $height); 

    // Copy the old image to the new image 
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 

    // Output to a temp file 
    $destFile = tempnam(); 
    imagepng($newImage, $destFile); 

    // Free memory       
    imagedestroy($newImage); 

    if (is_file($destFile)) { 
     $f = fopen($destFile, 'rb'); 
     $data = fread($f);  
     fclose($f); 

     // Remove the tempfile 
     unlink($destFile);  
     return $data; 
    } 

    throw new Exception('Image conversion failed.'); 
} 
+0

このソリューションをお寄せいただきありがとうございます! :)それは部分的に透明な写真(それは私の元の問題でした)とも機能します! – bastiandoeen

0

This articleあなたが望むものに合うようです。保存するimagejpeg()関数をimagepng()に変更し、ファイルをページに出力するのではなく文字列に保存する必要がありますが、既存のコードに簡単にコピー/貼り付けする必要があります。

0

GDは絶対に必要ですか? ImageMagickはより速く、より良い画像を生成し、より多くの設定が可能であり、最終的に(IMO)コード化するのがはるかに簡単です。

+0

シンプルなコマーシャルですが、何か証拠? – Green

+0

切り抜いたサムネイルを作るには: '$ image = new Imagick($ image_path); $ image-> cropThumbnailImage(100,100); 'GDでこれを2行のコードで実行してみてください。 ImageMagickは、画像を操作するために特別に設計されたツールキットですので、一般的には、PHPのランダムに投げ込まれた部分よりも優れています。 – ceejayoz

0

私はthis pageが良い出発点だと思います。それはimagecreatefrom(jpeg/gif/png)を使用し、画像のサイズを変更して変換してからブラウザに出力します。ブラウザを出力するのではなく、たくさんのコード書き換えなしでDBのBLOBに出力することができます。

3

gdlibを使用する場合は、gdlib 2以上を使用してください。これはimagecopyresampled()という関数を持っています。これは、サイズ変更中にピクセルを補間し、よりよく見えます。お使いのサーバがスクリプトを実行する必要があります

  • それは
  • ディスクよりもアクセスが遅くなります。

    はまた、私はいつも、データベースに画像を保存することは悪い形で、ネットの周りに注意を聞きました単にファイルを提供するの画像に代わり を取得

  • あなたのスクリプトは、今 を使用したWebサーバーが処理するために多くのものを担当します。
    • のSe
    • 適切なキャッシュ/タイムアウト/ Eタグヘッダーを設定すると、クライアントはイメージを適切にキャッシュできます。これを正しく行わないと、すべてのリクエストでイメージサービングスクリプトがヒットし、サーバーの負荷がさらに高まります。

私が見ることができる唯一の利点は、あなたが同期データベースと画像ファイルを保持する必要がないことです。私はまだそれに反対することをお勧めします。

+0

静的なドメインやcdn上の静的なサーバに軽い負荷をかけるのと比べて、DBからイメージを提供するのは間違いです。 – dlamblin

6

あなたのプロセスステップは次のようになります。それはimagecopyresizeまたはimagecopyresampled

  • 保存インクルードを使用してサイズ変更imagecreatefrom*
  • を使用してGDにサポートファイル形式であれば

    1. Verifyfiletype
    2. は、画像をロードします画像を使用してimagepng($handle, 'filename.png', $quality, $filters)

    ImageMagickは高速で、より良い画像を生成し、設定が容易で、最終的には(IMO)のコード作成がはるかに簡単です。

    @ceejayozちょうど新しいGD待つ - それはMySQLiをのようなOOPだと、それは実際には悪くはない:)

  • 3

    はあなたがサーバー上で何のImageMagickのを持っていませんか?

    私はゲストをあなたはPHPを使用しています。質問にはPHPが付けられています。私が使用しているホスティング会社には、phpinfo()に従ってImageMagick拡張機能が有効になっていません。

    しかし、私が彼らに質問したところ、は、PHPコードから利用可能なImageMagickプログラムのリストです。つまり、PHPにはIMインターフェースはありませんが、PHPから直接IMプログラムを呼び出すことができます。

    私はあなたに同じオプションがあることを望みます。

    そしてI 強くが同意します - データベースに画像を保存することはお勧めできません。

    3

    おそらくこのような何か、:

    
    <?php 
        //Input file 
        $file = "myImage.png"; 
        $img = ImageCreateFromPNG($file); 
    
        //Dimensions 
        $width = imagesx($img); 
        $height = imagesy($img); 
        $max_width = 300; 
        $max_height = 300; 
        $percentage = 1; 
    
        //Image scaling calculations 
        if ($width > $max_width) { 
         $percentage = ($height/($width/$max_width)) > $max_height ? 
          $height/$max_height : 
          $width/$max_width; 
        } 
        elseif ($height > $max_height) { 
         $percentage = ($width/($height/$max_height)) > $max_width ? 
          $width/$max_width : 
          $height/$max_height; 
        } 
        $new_width = $width/$percentage; 
        $new_height = $height/$percentage; 
    
        //scaled image 
        $out = imagecreatetruecolor($new_width, $new_height); 
        imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 
    
        //output image 
        imagepng($out); 
    ?> 
    

    しかし、それはあなたにそれを行うことができる方法についての公正なプレゼンテーションを与える必要があり、いくつかの構文エラーがあるかもしれないので、私は、コードをテストしていません。また、私はPNGファイルを想定していました。ファイルの種類を判断するために、ある種のswitch文を使用することができます。

    関連する問題