14

我有多个图像 - 保存为 Base64 字符串,现在我想调整这些图像的大小以获取它们的缩略图......

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

提前致谢

4

4 回答 4

17

我同意Jon Hanna 的方法:Do Parsing the Base64code then load it to GD Image before Resample。然而,要将它作为数据取回,它并不像我那么容易。在 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);

结果也是一个图像资源。要将其作为数据获取,我们需要Buffering
了解 如何从图像资源创建 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");
于 2015-03-25T08:41:35.710 回答
4

你最好的选择是在 PHP 中使用PHPThumb

另一种方法是调用 ImageMagick,但您更喜欢:

于 2012-09-01T23:37:54.297 回答
3

不知道如何在 node.js 中做到这一点(或任何事情),但你的问题中的 PHP 位肯定是可能的。解析完 Base64 后,将其加载到GD 图像中,然后重新采样

http://php.net/manual/en/function.imagecopyresampled.php

于 2012-09-01T23:37:00.867 回答
1

也许你可以使用一个库来处理它。试试宽幅图像。我已经使用它并且工作得很好。

例子:

$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/

于 2020-02-20T15:27:33.953 回答