2

ユーザーが画像をアップロードできるphpスクリプトがあります。ファイルサイズが「X」キロバイトより大きい場合は、スクリプトの画質(jpeg)を低くしたいと思います。

このようなもの:

if( $_FILES['uploaded_img']['size'] > $file_size_limit ){
     // code that lowers the quality of the uploaded image but keeps the image width and height
}

このための最良のアプローチは何ですか?

ps:画像の幅と高さを変更したくありません。

4

2 に答える 2

4

できますよ。このようなことをしてください。

$upload = $_FILES['uploaded_img'];
$uploadPath = 'new/path/for/upload/';
$uploadName = pathinfo($upload['name'], PATHINFO_FILENAME);
$restrainedQuality = 75; //0 = lowest, 100 = highest. ~75 = default
$sizeLimit = 2000;

if($upload['size'] > $sizeLimit) {
    //open a stream for the uploaded image
    $streamHandle = @fopen($upload['tmp_name'], 'r');
    //create a image resource from the contents of the uploaded image
    $resource = imagecreatefromstring(stream_get_contents($streamHandle));

    if(!$resource)
        die('Something wrong with the upload!');

    //close our file stream
    @fclose($streamHandle);

    //move the uploaded file with a lesser quality
    imagejpeg($resource, $uploadPath . $uploadName . '.jpg', $restrainedQuality); 
    //delete the temporary upload
    @unlink($upload['tmp_name']);
} else {
    //the file size is less than the limit, just move the temp file into its appropriate directory
    move_uploaded_file($upload['tmp_name'], $uploadPath . $upload['name']);
}

これは、PHP GDでサポートされているすべての画像形式を受け入れます(サーバーにインストールされていると仮定します。ほとんどの場合はそうです)。画像が制限未満の場合は、指定したパスに元の画像がアップロードされます。

于 2012-09-24T00:20:39.107 に答える
4

基本的なアプローチ(オースティンの回答で実装されている)はいつかは機能しますが、品質!=ファイルサイズを覚えておくことが重要です。。これらは一般的に相関関係がありますが、jpegファイルの品質を下げると実際にはファイルが大きくなる可能性があります(一般的ですら)。これは、システムにアップロードされたJPEGがすでにJPEG圧縮式(多くの場合79または80の品質)で実行されているためです。元の画像に応じて、このプロセスはアーティファクトを作成し、結果の画像を変更します。このすでに最適化された画像をjpeg圧縮アルゴリズムでもう一度実行すると、元の画像がどのように見えるかが「わかりません」...したがって、受信したjpegは、まったく新しいロスレスファイルであるかのように扱われ、コピーしようとします。可能な限り密接に...元のプロセスで作成されたアーティファクトを含みます。これを、元のjpeg圧縮がすでに「簡単な」ほとんどを利用しているという事実と組み合わせてください

カットオフがどこにあるかを確認するためにいくつかのテストを行いました。当然のことながら、元の画像の圧縮率が低い場合(q = 99)、q=75に再圧縮することで多くのスペースが節約されました。オリジナルがq=75(グラフィックプログラムのデフォルトではかなり一般的)で圧縮された場合、セカンダリq = 75の圧縮は見栄えが悪くなりますが、ファイルサイズはオリジナルと実質的に同じになります。オリジナルの圧縮レベルが低い場合(q = 50)、2次q = 75圧縮の結果、ファイルが大幅に大きくなりました(これらのテストでは、3枚の複雑な写真を使用しました...明らかに特定の口蓋/組成の画像ではパフォーマンスが異なりますこれらの圧縮を介して)。注:このテストにはFireworks cs4を使用しています...これらの品質指標には、プラットフォーム間で標準化されていないことに気付きました。

以下のコメントに記載されているように、PNGなどのファイル形式からJPEGに移行すると、通常は大幅に小さくなりますが(透明度はありません)、JPEG-> JPEG(または、特に単純な画像や口蓋の小さい画像の場合はGIF-> JPEG)になります。多くの場合、役に立ちません。

とにかく、オースティンが説明した圧縮方法を使用して試すことはできますが、完了したら2つの画像のファイルサイズを比較してください。増分ゲインが小さい場合、または新しいファイルが大きい場合は、デフォルトで元の画像に戻ります。

于 2012-09-24T01:08:02.407 に答える