web-dev-qa-db-ja.com

トランジェントAPIを使ってデータベースに画像を保存する方法を教えてください。

トランジェントAPI を使用して imagecreatefrompng() で生成された画像を保存しようとしていますが、空の文字列(string(0) "")が保存されているだけです。また、imagedestroy( $im )の前にトランジェントを設定すると、画像が壊れてまったく表示されません(壊れた画像のサムネイル)。

canTransients APIを使用してデータベースに保存できますか。上記のように画像を保存する方法

1
Jared

imagecreatefrom*関数は画像リソース識別子を返します。これは文字列にキャストされると(オプションを保存すると)空のstring(0) ""コンテナになります。

これらの関数によって作成された生の画像は、箱から出してシリアル化できる特定のデータ構造を持っていません。私が考えることができる2つの解決策:

画像ファイル

たとえば実際のPNGデータを取得して代わりに保存するには、 imagepng を使用します。

$image_resource = imagecreatefrompng( ... );

// do Gd manipulations

$temp = tempnam( sys_get_temp_dir(), 'image_cache_' );
imagepng ( $image_resource, $temp );

$image_data = file_get_contents( $temp );
set_transient( 'cached_image', base64_encode( $image_data ), 3600 );

unlink( $temp );

WordPressのオプションテーブルにはバイナリに対応していないLONGTEXT型のデータフィールドがあるので、常に base64_encode データを忘れないでください。

また、画像データをuploadsフォルダに代わりにキャッシュし、Transients APIを使用してそれらの画像名をキャッシュする方法もあります。

$image_resource = imagecreatefrompng( ... );

// do Gd manipulations

$upload_dir = wp_upload_dir();
$upload_file = $upload_dir['path'] . '/' . $unique_image_name;

imagepng ( $image_resource, $upload_file );

set_transient( 'cached_image', $upload_file, 3600 );

ダンピングピクセル

何らかの理由で、生のピクセルRGBA構造体を実際に格納する必要がある場合は、 imagecolorat を使用して、すべてのピクセルを読み取る必要があります。イメージのうち、巨大な配列を作成してそれをシリアル化します。このデータを取得するには、画像を再構築する必要があります。

このメソッドはオーバーヘッドが非常に大きく、色の割り当てやアルファブレンディングと混同される可能性があるため、簡単には使用しないでください。

2
soulseekah