[解決済み】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);
関連
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み] JavaScriptで画像をBase64文字列に変換するにはどうすればよいですか?
-
[解決済み] 背景画像データをCSSにBase64で埋め込むのは良い方法ですか、悪い方法ですか?
-
[解決済み】HTML5 Canvasをサーバーに画像として保存する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] コマンドの同期がとれていない。
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み】PHPのクラスが見つからないが、インクルードされている
-
phpのAllowed memory size of 134217728 bytes枯渇問題の解決法
-
[解決済み】Fatal error: mysqli_result 型のオブジェクトは使用できません [終了] 。
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] Base64文字列を画像ファイルに変換する?重複