Изменение размера изображений base64

У меня есть несколько изображений - сохранены как строки Base64, и теперь я хочу изменить размер этих изображений, чтобы получить их миниатюры...

Лучше всего было бы использовать Javascript (Node-Server) для изменения их размера, но было бы также возможно изменить их размер с помощью php.

заранее спасибо

3 ответа

Я согласен с методом Джона Ханны: выполните синтаксический анализ кода Base64, затем загрузите его в GD Image перед повторной выборкой. Однако вернуть его в виде данных не так просто, как я. На php в GAE необходимо включить буферизацию вывода, установив output_buffering = "On" в файле php.ini.

Здесь я объясню шаг подробно.

Этот документ взят как ссылка на создание ресурса изображения с использованием синтаксического анализа кода Base64: 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);

Результатом также является ресурс изображения. Чтобы получить его как данные, нам нужна буферизация.
Посмотрите, как создать base64encoded строку из ресурса изображения

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

Используя приведенный ниже документ, я установил корзину GCS для своего проекта в качестве веб-сайта, чтобы я мог хранить и отображать его напрямую: https://cloud.google.com/storage/docs/website-configuration

//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");

Лучше всего использовать PHPThumb в PHP.

Альтернатива - вызвать ImageMagick так, как вы предпочитаете:

Не знаю, как это сделать (или, ну, что угодно) в node.js, но бит PHP по вашему вопросу, безусловно, возможен. После анализа Base64 загрузите его в образ GD, а затем выполните повторную выборку.

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

Возможно, вы просто можете использовать библиотеку, чтобы справиться с этим. Попробуйте 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/

Другие вопросы по тегам