これが私の状況です-ユーザーがアップロードした画像からサイズ変更された jpeg 画像を作成し、それを S3 に送信して保存したいのですが、サイズ変更された jpeg をディスクに書き込んで S3 要求のために再ロードすることを避けたいと考えています。
JPEG形式の画像データを変数に保存して、メモリ内でこれを完全に行う方法はありますか?
PHP を使用するほとんどの人は、ImageMagick またはGd2のいずれかを選択します。
私は Imagemagick を使ったことがありません。Gd2 メソッド:
<?php
// assuming your uploaded file was 'userFileName'
if ( ! is_uploaded_file(validateFilePath($_FILES[$userFileName]['tmp_name'])) ) {
trigger_error('not an uploaded file', E_USER_ERROR);
}
$srcImage = imagecreatefromjpeg( $_FILES[$userFileName]['tmp_name'] );
// Resize your image (copy from srcImage to dstImage)
imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, RESIZED_IMAGE_WIDTH, RESIZED_IMAGE_HEIGHT, imagesx($srcImage), imagesy($srcImage));
// Storing your resized image in a variable
ob_start(); // start a new output buffer
imagejpeg( $dstImage, NULL, JPEG_QUALITY);
$resizedJpegData = ob_get_contents();
ob_end_clean(); // stop this output buffer
// free up unused memmory (if images are expected to be large)
unset($srcImage);
unset($dstImage);
// your resized jpeg data is now in $resizedJpegData
// Use your Undesigned method calls to store the data.
// (Many people want to send it as a Hex stream to the DB:)
$dbHandle->storeResizedImage( $resizedJpegData );
?>
お役に立てれば。
これは、GD ライブラリと出力バッファリングを使用して行うことができます。これが他の方法と比較してどれほど効率的かはわかりませんが、明示的にファイルを作成する必要はありません。
//$image contains the GD image resource you want to store
ob_start();
imagejpeg($image);
$jpeg_file_contents = ob_get_contents();
ob_end_clean();
//now send $jpeg_file_contents to S3
メモリに JPEG を取得したら ( ImageMagick、GD、または選択したグラフィック ライブラリを使用して)、オブジェクトをメモリから S3 にアップロードする必要があります。
多くの PHP S3 クラスはファイルのアップロードのみをサポートしているようですが、Undesignedのクラスは、私たちが求めていることを実行しているようです -
// Manipulate image - assume ImageMagick, so $im is image object
$im = new Imagick();
// Get image source data
$im->readimageblob($image_source);
// Upload an object from a resource (requires size):
$s3->putObject($s3->inputResource($im->getimageblob(), $im->getSize()),
$bucketName, $uploadName, S3::ACL_PUBLIC_READ);
代わりに GD を使用している場合は、
imagecreatefromstrings3->inputResource
を使用してストリームから画像を読み取ることができますが、上記で必要な結果のオブジェクトのサイズを取得できるかどうかはわかりません。getimagesizeは、高さ、幅、などですが、画像リソースのサイズではありません。
このゲームにはかなり遅れていますが、ConroyP と Imagick によって言及された S3 ライブラリを使用している場合は、getImageBlob が文字列を返すため、putObject() の代わりに putObjectString() メソッドを使用する必要があります。最終的に私のために働いた例:
$headers = array(
'Content-Type' => 'image/jpeg'
);
$s3->putObjectString($im->getImageBlob(), $bucket, $file_name, S3::ACL_PUBLIC_READ, array(), $headers);
私はこれに少し苦労しました。うまくいけば、他の誰かを助けるでしょう!
Imagemagick ライブラリがそれを可能にします。このようなPHPラッパーがたくさんあります(そのページでやりたいことのサンプルコードもあります;))
Maye はGD ライブラリを使用します。
画像の一部をコピーしてリサイズする機能があります。もちろん、その部分は画像全体にすることもできます。その場合は、サイズを変更するだけです。