web-dev-qa-db-fra.com

Comment puis-je stocker une image dans la base de données avec l'API transitoire?

J'essaie de stocker une image générée avec imagecreatefrompng() en utilisant l'API Transients , mais il ne stocke qu'une chaîne vide (string(0) ""). De plus, je remarque que si je règle le transitoire avant imagedestroy( $im ), l'image est cassée et ne s'affiche pas du tout (vignette d'image brisée).

Qu'est-ce que puis-je stocker dans la base de données avec l'API Transients? Comment pourrais-je stocker une image comme décrit ci-dessus?

1
Jared

Les fonctions imagecreatefrom* renvoient un identifiant de ressource image qui, lorsqu'il est converti en chaîne (enregistrement d'une option), crée un conteneur string(0) "" vide.

Les images brutes créées par ces fonctions ne possèdent aucune structure de données spécifique pouvant être sérialisée à l’origine. Deux solutions auxquelles je peux penser:

fichiers d'image

Utilisez imagepng , par exemple, pour obtenir les données PNG réelles et les stocker à la place.

$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 );

N'oubliez pas de toujours base64_encode les données, car la table d'options dans WordPress contient des champs de données de type LONGTEXT qui ne sont pas prêts pour les binaires.

Notez également comment vous pouvez peut-être mettre en cache les données d'image dans le dossier uploads et utiliser l'API Transients pour mettre en cache leurs noms d'image:

$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 );

dumping pixels

Si, pour une raison ou une autre, vous devez réellement stocker les structures RGBA brutes en pixels, vous devrez alors utiliser le imagecolorat et lire chaque pixel de l'image, créez un énorme tableau et le sérialiser. La récupération de ces données nécessitera la reconstruction de l'image.

Cette méthode a un coût très élevé, peut créer de la confusion avec les attributions de couleurs et le mélange alpha, donc, en bref, ne doit pas être utilisée.

2
soulseekah