1. ホーム
  2. php

[解決済み】PNG画像をサーバーサイドで保存する方法(base64データのURIから)。

2022-04-06 15:21:26

質問

Nihilogicの"Canvas2Image"というJavaScriptツールを使って、キャンバス画をPNG画像に変換しています。 今必要なのは、このツールが生成するbase64文字列を、PHPを使用してサーバー上の実際のPNGファイルに変換することです。

つまり、現在私が行っているのは、クライアント側でCanvas2Imageを使ってファイルを生成し、base64エンコードされたデータを取り出してAJAXでサーバーに送信することです。

// Generate the image file
var image = Canvas2Image.saveAsPNG(canvas, true);   

image.id = "canvasimage";
canvas.parentNode.replaceChild(image, canvas);

var url = 'hidden.php',
data = $('#canvasimage').attr('src');

$.ajax({ 
    type: "POST", 
    url: url,
    dataType: 'text',
    data: {
        base64data : data
    }
});

この時点で、"hidden.php"は次のようなデータブロックを受け取ります。 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABE....

ここからは、かなり困っています。私が読んだところでは、PHPの イメージクリエイトフロムストリング 関数がありますが、Base64エンコードされた文字列から実際にPNG画像を作成し、サーバーに保存する方法がよくわかりません。 どうか助けてください。

どのように解決するのですか?

その文字列からbase64の画像データを取り出してデコードし、ディスクに保存する必要があります。すでにpngになっているので、GDは必要ありません。

$data = 'data:image/png;base64,AAAFBfj42Pj4';

list($type, $data) = explode(';', $data);
list(, $data)      = explode(',', $data);
$data = base64_decode($data);

file_put_contents('/tmp/image.png', $data);

そして、ワンライナーとして。

$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));

抽出、復号、エラーチェックの効率的な方法として

if (preg_match('/^data:image\/(\w+);base64,/', $data, $type)) {
    $data = substr($data, strpos($data, ',') + 1);
    $type = strtolower($type[1]); // jpg, png, gif

    if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
        throw new \Exception('invalid image type');
    }
    $data = str_replace( ' ', '+', $data );
    $data = base64_decode($data);

    if ($data === false) {
        throw new \Exception('base64_decode failed');
    }
} else {
    throw new \Exception('did not match data URI with image data');
}

file_put_contents("img.{$type}", $data);