调整大小的base64图片

14

我有多张图片,已保存为Base64字符串,现在我想将它们调整大小以获取缩略图...

最好使用Javascript(Node-Server)来调整它们的大小,但也可以使用php进行调整。

谢谢提前。

4个回答

17

我同意Jon Hanna的方法:对Base64code进行解析,然后加载到GD图像中再进行重新采样。然而,要将其作为数据获取回来并不像我想象的那么容易。在GAE上的php中,需要通过在php.ini文件中设置output_buffering = "On"启用输出缓冲

这里我详细解释了每个步骤。

本文档参考了使用Base64code解析创建图像资源的方法:http://php.net/manual/en/function.imagecreatefromstring.php

// Create image resource from Base64code
$data64 = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl'
        . 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr'
        . 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r'
        . '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
$image = imagecreatefromstring(base64_decode($data64));

这是一个图像资源,可以直接放入Resample函数中使用:http://php.net/manual/en/function.imagecopyresampled.php

// Resample
$image_p = imagecreatetruecolor($new_w, $new_h);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_w, $new_h, $org_w, $org_h);

结果也是一个图像资源。要将其作为数据获取,我们需要缓冲
请参见如何从图像资源创建base64编码的字符串

// Buffering
ob_start();
imagepng($image_p);
$data = ob_get_contents();
ob_end_clean();

使用下面的文档,我在我的项目上设置了一个GCS存储桶作为网站,以便我可以直接进行存储和展示

https://cloud.google.com/storage/docs/website-configuration#tips
//Store & Display
$context = stream_context_create([
   'gs' =>[
        'acl'=> 'public-read', 
        'Content-Type' => 'image/jpeg', 
        'enable_cache' => true, 
        'enable_optimistic_cache' => true,
        'read_cache_expiry_seconds' => 300,
    ]
]);
file_put_contents("gs://mybucket/resample/image.jpeg", $data, false, $context); 
header("Location: http://mybucket/resample/image.jpeg");

值得一提的是,imagecopyresampled() 生成的质量比 imagecopyresized() 更好,因为它进行了插值。 - garrettlynchirl

4

在使用 PHP 调整大小后,您有什么想法可以在我的 Node.js 应用程序中访问它们吗? - Lukas Olsen

3

我在服务器上没有写入权限 - 我该如何将这些缩略图链接到我的Node.js应用程序?有什么想法吗? - Lukas Olsen
对于我来说,这属于上面提到的“我不知道如何在node.js中做任何事情”的部分。恐怕只有其他人可能会有好主意了。 - Jon Hanna
我已经寻找这个答案两天了... 通常情况下,使用node应该没问题 - 但在我的node应用中,我也没有写入权限...太糟糕了。 - Lukas Olsen
祝你好运。我只能回答我知道的部分。 - Jon Hanna
你将来打算如何进行永久存储?作为临时解决方案,你可以创建一个应用程序级全局图像哈希表元素,将图像存储为缓存... - jcolebrand
这个应用程序仅用于大学项目,因此永远不需要进行永久存储 - 即使我想要也是如此 - 最简单的解决方案是花钱获得写入权限... - Lukas Olsen

2
也许你可以使用一个库来处理这个问题。尝试使用WideImage。我已经使用过它,效果非常好。
示例:
$image = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $req->image));

$thumbnail = WideImage::load($image)
  ->resize(300, 300, 'inside')
  ->crop('center', 'center', 300, 300);

图书馆文档:http://wideimage.sourceforge.net/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接