1

簡単に解決できると思っていた問題が、予想よりも少し難しくなっています。

私は、誰かが製品の画像をアップロードできるサイトに取り組んでおり、その場で 2 回 (500x500 と 150x150) サイズを変更します。縦横比を維持しようとしています。たとえば、600x500 の画像がある場合、500x417 と 150x125 にサイズ変更されます。

このクラスなど、これを行うコードを(たくさん)見つけましたが、常にメモリの問題に遭遇します。サイズ変更後にクラスが一時画像をアンロード/破棄していないと思います。

ホストにメモリ制限を 32 から 64M にアップグレードしてもらいましたが、後でメモリが不足しました。私も PHP 5.2.13 で立ち往生しているので、ガベージ コレクターはありません。

私のPHPはかなり新しいので、クラスがどのように機能するかは私にとって非常に異質です。それ以外の場合は、必要に応じてimagedestroy()関数を追加してみます。リンクされたクラスを何時間もいじりましたが、成功しませんでした。

誰でもできますか:

-アスペクトを維持し、サイズ変更が完了した後に一時画像をアンロード/破棄して、RAM 使用量を制御する魔法のクラスの方向を教えてください。

-一時的なイメージを破棄するためにクラス (投稿されたものなど) をどこでどのように変更できるかについて、(非常に必要な) ガイダンスを教えてください。

-これが非常に間違っているかどうか教えてください。

ああ、私はある時点で WideImage クラスを動作させていましたが、うまく動作し、その後突然停止しました。私はそれを修正しようとして何時間も費やしましたが、成功しませんでした。

私の PHP インストールには GD がありますが、ImageMagick はありません。

ありがとう!

4

3 に答える 3

1

さて、私は自分の問題を解決することができました。

私は座って、すべてのサイズ変更コードを消去し、ゼロから始めて、必要なことを行うためのこの素晴らしい小さな関数を作成しました。

function resizeimage($targetw, $targeth, $input, $savedest) {
    list($oldw, $oldh) = getimagesize($input);
    $imgratio = ($oldw / $oldh);
     if ($imgratio>1) { 
         $new_width = $targetw; 
         $new_height = ($targeth / $imgratio); 
     } else { 
         $new_height = $targeth; 
         $new_width = ($targetw* $imgratio); 
     }
  $imagetemp = imagecreatetruecolor($new_width, $new_height);
  $imageorig = imagecreatefromjpeg($input);
  imagecopyresampled($imagetemp, $imageorig, 0, 0, 0, 0, $new_width, $new_height, $oldw, $oldh);
  imagejpeg($imagetemp, $savedest, 95);
  imagedestroy($imageorig);
  imagedestroy($imagetemp);
  unset($oldw,$oldh,$imgratio,$new_height, $new_width, $imagetemp, $imageorig);
}

ターゲットの幅と高さ、入力画像の場所 (例: "uploads/images/testimage.jpg")、および保存する場所 ("uploads/images/resizedtestimage.jpg") を入力します。

このスニペットが将来誰かに役立つことを願っています!

于 2012-05-24T03:59:45.580 に答える
0

GD画像処理の例を次に示します。http: //fdcl.svn.sourceforge.net/viewvc/fdcl/trunk/modules/imageprocessing/gd/module.inc?revision = 212&view = markup

1つのアプローチはこのテクニックです:

  • 画像を開く500に拡大縮小
  • imagedestroy($this->original_image)
  • 500に縮小された画像を使用し、150に縮小されます
  • imagedestroy($this->image500)
  • imagedestroy($this->image150)

最後のアイデアは、利用可能なコマンドラインツールを使用してサイズ変更を行うことです。

于 2012-05-23T14:56:08.657 に答える
0

私は似たようなことをしましたが、Linux サーバーのコマンドラインから実行できる 2 つのアプリを使用しました。

ImageMagick モグリファイ: http://www.imagemagick.org/www/mogrify.html

mogrify -resize 750 "image.jpg" 

幅 750 ピクセルにサイズ変更されます

jpegoptim: http://freecode.com/projects/jpegoptim

jpegoptim "image.jpg" –max=70 --strip-all

jpeg を 70% に最適化し、画像から不要な肥大化をすべて取り除きます。

どちらも CLI から実行され、多くのコマンド オプションが提供されます。いずれかまたは両方を使用してもそれほど難しくはありません。

于 2012-05-23T15:36:18.700 に答える