【问题标题】:Resizing base64 Images调整 base64 图像大小
【发布时间】:2012-09-01 23:28:19
【问题描述】:

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

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

提前致谢

【问题讨论】:

    标签: php image node.js resize base64


    【解决方案1】:

    我同意the method from Jon Hanna解析 Base64code,然后在重新采样之前将其加载到 GD Image。然而,要将它作为数据取回,它并不像我那么容易。在 GAE 中的 php 上,需要通过在 php.ini 文件中设置 output_buffering = "On" 来设置 enable output buffering

    这里我详细解释一下步骤。

    此文档被视为使用 Base64code 的解析创建图像 Resource 的参考: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);
    

    结果也是一个图像资源。要将其作为数据获取,我们需要缓冲
    how to create a base64encoded string from image resource

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

    使用下面的文档,我将 my project 上的 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() 好得多,因为它会进行插值。
    【解决方案2】:

    【讨论】:

    • 知道如何在使用 php 调整大小后在我的 node.js 应用程序中访问它们吗?
    【解决方案3】:

    不知道如何在 node.js 中做到这一点(或任何事情),但你的问题中的 PHP 位肯定是可能的。解析完Base64后,加载到GD image然后resample就可以了。

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

    【讨论】:

    • 我在我的服务器上没有写权限 - 我如何将这个拇指链接到我的 node.js 应用程序?有什么想法吗?
    • 这属于我上面的“不知道如何在 node.js 中做到这一点(或者好吧,任何事情)”位,我害怕。希望其他人有一个好主意。
    • 现在正在寻找这个问题的答案 2 天......通常它可以在节点上正常工作 - 但在我的节点应用程序中我也没有写权限......这很糟糕跨度>
    • 祝你好运。我只能回答我知道的一点。
    • 未来你打算如何做永久存储?作为临时解决方案,您可以做的一件事是拥有一个应用级全局图像哈希表元素,将图像存储为缓存...
    【解决方案4】:

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多