0

画像アップロード フォームがあり、ユーザーは画像ファイルを添付し、画像サイズを選択してアップロードした画像ファイルのサイズを変更します (200kb、500kb、1mb、5mb、オリジナル)。次に、スクリプトはユーザーのオプションのサイズに基づいて画像ファイルのサイズを変更する必要がありますが、この機能を実装する方法がわかりません。

たとえば、ユーザーが 1 MB のサイズの画像をアップロードし、ユーザーがサイズ変更するために 200 KB を選択した場合、スクリプトはそれを 200 KB のサイズで保存する必要があります。

誰かが同様のタスクについて知っているか、経験がありますか?

事前にご返信いただきありがとうございます。

4

2 に答える 2

5

GD ライブラリでは、 を使用しますimagecopyresampled()

<?php
// The file
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);
?>

編集:画像ファイルのサイズを指定したサイズに変更したい場合、それは少し難しいです。主要な画像形式はすべて圧縮を使用しており、圧縮率は圧縮対象の性質によって異なります。澄んだ青空を圧縮すると、人の海よりも圧縮率が高くなります。

あなたができる最善の方法は、特定のサイズを試して、特定のサイズを試して、ファイルサイズが何であるかを確認し、必要に応じて調整することです.

Resize ratio = desired file size / actual file size
Resize multipler = square root (resize ratio)
New height = resize multiplier * actual height
New width = resize multiplier * actual width

これは基本的に、予想される圧縮率の概算を考慮に入れます。ある程度の許容範囲 (+/- 5% など) があり、必要に応じて数値を微調整できると思います。

特定のファイル サイズに直接リサイズする方法はありません。最後に、特定のファイル サイズへのサイズ変更はかなり珍しいことです。特定の高さおよび/または幅へのサイズ変更 (アスペクト比を維持する) は、はるかに一般的であり、(ユーザーによって) 期待されています。

更新:正しく指摘されているように、これによりファイルサイズが間違っています。比率は、ファイル サイズの比率の平方根である必要があります (高さに 1 回、幅に 1 回)。

于 2009-09-23T03:11:11.187 に答える
2

PHP で提供される GD ライブラリを使用する:

// $img is the image resource created by opening the original file
// $w and $h is the final width and height respectively.
$width = imagesx($img);$height = imagesy($img);
$ratio = $width/$height;

if($ratio > 1){
// width is greater than height
$nh = $h;
$nw = floor($width * ($nh/$height));
}else{
$nw = $w;
$nh = floor($height * ($nw/$width));
}

//centralize image
$nx = floor(($nw- $w) / 2.0);
$ny = floor(($nh-$h) / 2.0);

$tmp2 = imagecreatetruecolor($nw,$nh);
imagecopyresized($tmp2, $img,0,0,0,0,$nw,$nh,$width,$height);

$tmp = imagecreatetruecolor($w,$h);
imagecopyresized($tmp, $tmp2,0,0,$nx,$ny,$w,$h,$w,$h);

imagedestroy($tmp2);imagedestroy($img);

imagejpeg($tmp, $final_file);

このコードは元の画像を取得し、指定されたサイズにサイズ変更します。最初に画像の縦横比のサイズ変更を試み、次にトリミングして画像を中央に配置し、指定された寸法にうまく収まるようにします。

于 2009-09-23T03:12:33.827 に答える