从mysql存储的图像创建缩略图

时间:2012-01-29 01:56:52

标签: php mysql image image-processing gd

我有一个名为users的表,每行(用户)都有一个图像。

使用以下代码将映像作为BLOB存储在mysql数据库中:

$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

对于数据库中的每个条目。

----编辑----

忘记提及,random_32()是一个生成32个字符长的随机字符串的函数,以便命名图像。

2 个答案:

答案 0 :(得分:2)

这就是为什么在数据库中存储文件是个坏主意的众多原因之一......

getimagesize()适用于文件,而不是字符串。由于您已经在字符串中获得了原始图像,因此使用imagecreatefromstring(),然后使用imagesx()和imagesy()函数来获取尺寸:

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实际上有一点聪明,可以弄清楚图像是什么类型,不像那些非常蠢的createfromgif / jpg / png / etc ...函数,它只适用于那些特定的文件类型。

答案 1 :(得分: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

请注意,您需要添加错误处理,而不是。