2012-01-29 9 views
0

私はusersという名前のテーブルを持ち、各行(ユーザ)には画像があります。mysqlに保存された画像からサムネイルを作成します

画像は、このコードを使用してMySQLデータベースにBLOBとして格納されている:

$filename = $_FILES['image']['tmp_name']; 
$size = getimagesize($filename); 
$handle = fopen($filename , "rb"); 
$content = fread($handle , filesize($filename)); 
fclose($handle); 
unlink($filename); 
$image = base64_encode($content); 
// .... send query to database .... 

これは、最初に働いたが、より多くの画像が各ページに表示されなければならないように、それが実際にロードされますですから、PHPのGDを使ってサーバのファイルシステムに保存されているサムネイルを作成したいと思います。

私は次のコードを持っていますが、サムネイルを作成できるように、データベースからイメージを読み取るために何をすべきかわかりません。

$query = "SELECT * FROM users;"; 
$result = mysql_query($query); 
while($row = mysql_fetch_array($result)) { 
    $uploaded_image = base64_decode($row['image']); 
    $size = getimagesize($uploaded_image); <-------------------- 
    $dimension_x = 73; 
    $dimension_y = 73; 
    $directory = 'views/images/generated/people/'; 
    do{ 
    $filename = random_32(); 
    $filename = $directory.$filename.'.jpg';  
    } while(file_exists($filename)); 
$image = imagecreatefromjpeg($uploaded_image); 
$thumb = imagecreatetruecolor($dimension_x , $dimension_y); 
$size = getimagesize($uploaded_image); 
imagecopyresampled($thumb , $image , 0 , 0 , 0 , 0 , $dimension_x , $dimension_y , $size['0'], $size['1']); 
imagejpeg($thumb , $filename , 100); 
} 

私は、矢印がスクリプトを動作させるためにどこに置くべきかを探そうとしています。

はすべてそれが今、データベース内のすべてのエントリに対して出力

Warning: getimagesize(ÿØÿà): failed to open stream: No such file or directory in /var/www/play/ns4/models/create_thumbs_people.php on line 12 

あるん。

---- EDIT ----

は言及を忘れ、random_32は()画像が命名されているように、32文字のランダムな文字列を生成する関数です。

答えて

2

そしてここで、データベース内のファイルを格納するには悪い考えである多くの理由の一つだ...

getimagesize()は、ファイルではなく、文字列で動作します。 imagecreatefromstringが実際に知性のビットを持っていると把握することができますことを

while($row = mysql_fetch_array($result)) { 
    $uploaded_image = base64_decode($row['image']); 
    $image = imagecreatefromstring($uploaded_image); 
    $uploaded_x = imagesx($image); // X dimension 
    $uploaded_y = imagesy($image); // Y dimension 
    etc.... 

注:文字列の生の画像を持っているので、寸法を得るためにimagecreatefromstring()、その後、imagesx()とimagesy()関数を使用しますどのようなタイプの画像であるのかは、これらの特定のファイルタイプでのみ機能する非常に乱暴なcreatefromgif/jpg/png/etc ...関数とは異なります。

+0

私はあなたのコードを試して、imagecopyresampledの値を変更しました。それは魅力的でした! – ppp

2

あなたは正しい軌道に乗っていますが、$ uploaded_imageはファイルパスではなくイメージの内容です。 getimagesizeには、最初の引数としてファイル名が必要です。

は概念的には、ここで行われる必要がある変更があります:

  • はここにいくつかのサンプルコードがあります

その一時的な場所に$ uploaded_image一時的な場所へ

  • コールgetimagesizeの内容を書きます(未テスト):

    $uploaded_image = base64_decode($row['image']); //this is from your code above, should work fine 
    $uploaded_temp_file = tempnam(sys_get_temp_dir(), 'user_image'); //generate a temporary file name in your OS's temp folder 
    $uploaded_temp_res = fopen($uploaded_temp_file, 'wb'); //open the file for binary write 
    fwrite($uploaded_temp_res, $uploaded_image); //commit binary data to the file 
    fclose($uploaded_temp_res);  //close the file handle 
    $size = getimagesize($uploaded_temp_file);  //finally, get the image size 
    

    antはエラー処理を追加するもので、そうでないものはありません。

  • +0

    お時間をいただきありがとうございます。私はあなたの答えを見たときに私はすでに別の方法を行っていたので、@マークBが提案したことをしました。 – ppp

    関連する問題