我如何使用瞬时API将图像存储在数据库中?

时间:2012-03-11 作者:Jared

我正在尝试存储用生成的图像imagecreatefrompng() 使用Transients API, 但它只存储一个空字符串(string(0) ""). 此外,我注意到如果我在imagedestroy( $im ), 图像已损坏,根本不显示(损坏的图像缩略图)。

我可以用瞬态API在数据库中存储什么?如何存储如上所述的图像?

1 个回复
最合适的回答,由SO网友:soulseekah 整理而成

imagecreatefrom* 函数返回图像资源标识符,当转换为字符串(保存选项)时,将导致空string(0) "" 容器

这些函数创建的原始图像没有任何可以立即序列化的特定数据结构。我可以想到两种解决方案:

图像文件使用imagepng, 例如,获取实际的PNG数据并将其存储。

$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 );
记住永远base64_encode 数据,因为WordPress中的选项表LONGTEXT 键入未准备好二进制的数据字段。

还要注意如何将图像数据缓存在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 然后读取图像的每个像素,创建一个巨大的数组并将其序列化。检索此数据需要重建图像。

这种方法有很高的开销,可能会与颜色分配和alpha混合混淆,所以简而言之,不应该使用。

结束

相关推荐

Switching database on the fly

我读过here 关于使用动态切换当前wp数据库$wpdb->select(\'database_name\'); 一旦完成,我理解我将不得不向原始数据库发出相同的语句。问题:更改数据库后,我是否需要刷新缓存或类似的东西才能正常工作?我需要再次呼叫WP标头吗?潜在问题?