Resizing base64 Images

前端 未结 4 1253
无人及你
无人及你 2020-12-10 12:38

I have multiple Images - saved as Base64 Strings and now i want to resize these images to get thumbnails of them...

Best would be using Javascript (Node-Server) to r

4条回答
  •  有刺的猬
    2020-12-10 13:17

    I agree to the method from Jon Hanna: Do Parsing the Base64code then load it to GD Image before Resample. However to get it back as data it is not as easy as I though. On php in GAE it will need to enable output buffering by setting output_buffering = "On" in php.ini file.

    Here I explain the step in detail.

    This doc is taken as reference to Create Image Resource using the Parsing of 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));
    

    This is an image resource which can be directly put to the Resample function: 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);
    

    The result is also an image resource. To get it as a data we need Buffering.
    See how to create a base64encoded string from image resource

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

    Using doc below I set a GCS bucket on my project as a website so I can Store & Display it directly: 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");
    

提交回复
热议问题