从数据库中旋转图像并保存为数据库blob类型


rotate image from database and save to database blob type

保存图片到数据库

$query =$myClass->query("insert into tblImage(document) values(".base64_encode(file_get_contents($_FILES['imageFile']["tmp_name"])).")");   

显示数据库中的图像

$image =$myClass->query("select document from  tblImage where code=1");                                                                             
$output_bin_string = base64_decode($image[0]['thumbDocument']);
header("Content-Type: image/jpeg");
header("Content-Length: " . strlen($output_bin_string));          
echo $output_bin_string;    

我可以保存图像到文件,然后保存到数据库

$image=$myClass->query('select document form tblImage where code=1' );   
$source = imagecreatefromstring(base64_decode($image[0]["document"])) ;
$rotate = imagerotate($source,$degrees,0);
imagejpeg($rotate,'tmp/1.jpg');
$image =$myClass->query("update tblImage set document='".base64_encode(file_get_contents('tmp/1.jpg'))."'   where code=1");

问题:有一种方法可以旋转图像并保存到数据库,而不需要像这样保存图像到文件

$image=$myClass->query('select document form tblImage where code=1' );   
$source = imagecreatefromstring(base64_decode($image[0]["document"])) ;
$rotate = imagerotate($source,$degrees,0);
$image =$myClass->query("update tblImage set document='".base64_encode($rotate)."'   where code=1");

此代码显示错误:base64_encode() expects parameter 1 to be string, resource given

在数据库中保存文件是一种糟糕的做法,与本地文件系统访问或其他存储后端(如S3)相比,它的性能相当差。看一下这个问题:在数据库mysql中保存图像

您的方法将导致数据在进入客户端之前经过DB, php和web服务器。而将它直接保存在文件系统中,并在数据库中保持对文件的引用,将允许您在请求时直接通过web服务器发送它。

正确的方法是在保存文件引用的应用程序中有一个表,例如我们称之为file_storage。然后根据需要关联行:以"用户1:1头像"、"用户1:n照片"、"照片n:n图库"为例。这是DRY,维护SoC,甚至允许我在不同的后端存储文件。你也可以阅读CakePHP插件的文档,它的功能和我刚才描述的完全一样。

对于图像处理,我建议使用Imagine库。下面是取自文档的一个示例:
use Imagine'Image'Box;
use Imagine'Image'Point;
$image->resize(new Box(15, 25))
   ->rotate(45)
   ->crop(new Point(0, 0), new Box(45, 45))
   ->save('/path/to/new/image.jpg');

您应该首先将图像资源转换为字符串(通过将输出缓冲为变量),然后将其保存到数据库中,如下所示:

// ... your previous code
$rotate = imagerotate($source,$degrees,0);
// New code starts here
ob_start();
imagejpeg($rotate);
$imageData = ob_get_clean(); 
$image =$myClass->query("update tblImage set document='".base64_encode($imageData)."'   where code=1");

注意,这必须在向客户端发送任何输出之前完成,否则ob_start()将失败。