3

編集

すべての回答、特に関数で計算された値を使用していないことに気付いた @Mailerdaimon に感謝しますimagecopyresampled

黒い画像はもう得られませんが、まだ黒い部分が得られるので、比率の式を更新する必要があると考えています。示しています。

画像の高さが完全に収まるようにするにはどうすればよいですか?


以下は、ユーザーが写真をアップロードできるようにする簡単なスクリプトです。アップロードが完了すると、写真は 170px(h) x 150px(w) のサムネイルとして表示されます。

出力画像が 170x150px であるため、サイズ変更部分は機能しますが、

if ($_SERVER["REQUEST_METHOD"] == "POST") 
{

$maxWidth  = 150;
$maxHeight = 170;

$name = $_FILES ['image'] ['name'];
$type = $_FILES ["image"] ["type"];
$size = $_FILES ["image"] ["size"];
$tmp_name = $_FILES ['image'] ['tmp_name'];
list($originalWidth, $originalHeight) = getimagesize($tmp_name);


 if ($originalWidth > $originalHeight) 
 {
   $thumbnail_height = floor(($originalHeight/$originalWidth)*$maxWidth);
   $thumbnail_width  = $maxWidth;
 } else {
   $thumbnail_width  = floor(($originalWidth/$originalHeight)*$maxHeight);
   $thumbnail_height = $maxHeight;
 }

 // Resample  
  $image_p = imagecreatetruecolor($maxWidth, $maxHeight);
  imagecreatefrompng($tmp_name);
  imagecopyresampled($image_p, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, 
  $originalWidth, $originalHeight);

//start upload process
$RandomNumber = uniqid();
$location = "uploads/$RandomNumber";
imagejpeg($image_p,  $location, 100);      

$sql=query("UPDATE users SET image = '".$location."' WHERE id = '$id'"); 

        } 
  }

私が間違っていることは何か分かりますか?

4

3 に答える 3

1
  1. フォルダ「uploads」が書き込み可能であるか、Web サーバーによって所有されていることを確認してください。
  2. 絶対パスを使用してみてください: /var/www/mysite/uploads
  3. 重複を避けるために、行 ID のハッシュや md5、またはイメージ自体など、ランダム ID とは異なるものを使用してみてください。

最後の部分を変更できます:

...

$RandomNumber = md5($image_p); $location = "/var/www/mysite/uploads/$RandomNumber"; if( imagejpeg( $image_p, $location, 100 ) ){
query("UPDATE users SET image = '".$location."' WHERE id = '$id'"); }

...

于 2013-10-23T20:53:30.293 に答える
0

初めに、

@getimagesize($_FILES['userfile']['tmp_name']))

この関数は、ファイルが (拡張子だけでなく) 実際の画像であるかどうかをチェックします。ファイルが画像でない場合は、false が返されます (そして警告が返されます。これが at の理由です)。

ファイルが実際の画像である場合、必要に応じてこれを返すことができます:

list($width, $height, $type, $attributes) = @getimagesize($_FILES['userfile']['tmp_name']))

またはちょうどサイズ:

$size = @getimagesize($_FILES['userfile']['tmp_name']))

したがって、この関数を使用している場合は、忘れずに at を追加し、if条件を使用して実際の画像を受信して​​いるかどうかを確認してください。

一方、実際の画像を受け取っていて、必要なサイズよりも小さいことを検証した後、次のことができます。

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $imagePath)

where$imagePathは、イメージを保護するパスです。

次に、次のことができます。

$image = imagecreatefromjpeg($imagePath);
$canvas=imagecreatetruecolor($maxwidth,$maxheight);
imagecopyresampled($canvas, $image ,0,0,0,0,$maxwidth, $maxheight, $originalWidth, $originalHeight);

そして、適切な画像のサイズが変更されます。

于 2013-10-28T20:35:35.330 に答える