GdipSaveImageToStream()



Syntaxe
Resultat.i = GdipSaveImageToStream(*image, *stream, @clsidEncoder.CLSID, @encoderParams.EncoderParameters)

Paramètres

*image

[in] Pointeur sur un objet image qui défini l'image sauvegardée dans le stream.
Si le stream enregistre une séquence d'image (format TIFF ou GIF), ce pointeur sera passé aux fonctions GdipSaveAddImage() pour ajouter des pages à la séquence (images) et GdipSaveAdd() pour clôturer la séquence d'images.

*stream

[in] Pointeur sur une instance de l'interface COM IStream qui pointe un stream (flux de données).

clsidEncoder.CLSID

[in] Variable de type CLSID qui spécifie l'encodeur utilisé pour sauvegarder l'image.

encoderParams.EncoderParameters

[in] Pointeur sur la structure EncoderParameters qui contient des paramètres à utiliser par l'encodeur. Si ce paramètre n'est pas utilisé, il doit être mis à 0.

Description

Cette fonction permet d'enregistrer une image dans un flux de données (stream) en spécifiant le format parmi ceux gérés par GDI+.
Les format gérés par GDI+ sont les suivants :

Format nécessitant un encodeur/décodeur :

BMP, GIF, JPEG, PNG, TIFF

Format ne nécessitant pas d'encodeur/décodeur :

WMF, EMF, ICON

Les fonctions GdipLoadImageFromStream(), GdipLoadImageFromStreamICM(), GdipCreateBitmapFromStream() ou GdipCreateBitmapFromStreamICM() peuvent être utilisées pour créer une image ou un bitmap depuis les images enregistrées dans le stream.. Les séquences d'images au format TIFF sont supportées.

Gdi+ 1.0 ne supporte pas les gif à séquence d'images (images multiples).

Le paramètre *image est un identifiant GDI+ retournée par une des fonctions de création d'image. Cette image sera celle qui sera enregistrée dans le stream.

Le second paramètre est un pointeur sur un objet stream, plusieurs API permettent de créer un stream, les exemples utilisent l'interface IStorage et la méthode CreateStream pour créer l'objet. Un objet storage et un objet stream sont créés et sont ensuite détruits avec la méthode *storage\DestroyElement() pour le stream et *storage\Release() pour l'objet storage.
Le troisième paramètre est une identifiant CLSID sur le type de l'encodeur voulu. La procédure GetEncoderClsid(format.s, *Clsid.CLSID) permet de retrouver cette valeur et est définie dans le fichier gdiplus.pbi.

Le dernier paramètre (encoderParams.EncoderParameters) est une variable de type EncoderParameters.

Le premier élément de la structure EncoderParameters est le nombre de structures EncoderParameter contenu dans le tableau (2ème paramètre de la structure EncoderParameters).
Le tableau EncoderParameter sera rempli comme ceci :
L'élément Guid sera rempli avec la valeur de l'identifiant pour le type de format voulu (les différentes valeurs sont définies dans le fichier PB des GUID).
Ce paramètre est rempli avec la commande PB CopyMemory().
L'élément EncoderParameter\NumberOfValues est le nombre d'éléments pointé par le membre *value de la structure.
L'élément EncoderParameter\Type vaut une des constantes de l'énumération
EncoderParameterValueType.
L'élément EncoderParameter\Value (pointeur) dépend du type défini par le paramètre EncoderParameter\Type. Par exemple, cette valeur peut être l'adresse d'une variable de type long dont la valeur est une des valeurs de l'énumération EncoderValue permettant de définir par exemple le type de compression..

Le premier exemple crée un stream, charge 4 images de format différent, retrouve le CLSID de l'encodeur TIFF; enregistre les 4 images en suivant dans le stream sous la forme d'une image TIFF (séquence d'images), détruit les images ayant servies à l'enregistrement dans le stream, crée un nouvelle image à partir de l'image enregistrée dans le stream et finalement affiche une réduction de chaque images en utilisant des ImageGadget PureBasic.
Les étapes pour sauvegarder une séquence d'images (TIFF) dans un stream sont les mêmes que celles décrites à la fonction GdipSaveAddImage().
Le deuxième exemple crée un stream, charge une image format PNG, retrouve le CLSID de l'encodeur JPEG; enregistre l'image dans le stream au format JPEG sans compression, détruit l'image ayant servie à l'enregistrement dans le stream, crée un nouvelle image à partir de l'image enregistrée dans le stream et finalement affiche l'image en utilisant une ImageGadget PureBasic, l'image a les côtés divisés par 4 (la fenêtre est redimensionnée pour afficher l'image).
Pour la sauvegarde de l'image JPEG sans compression, les étapes sont les suivantes :
Le premier paramètre (*image) de la fonction est l'identifiant GDI+ de l'image ayant servi à créer le fichier (fonction GdipSaveImageToFile()) ou le stream (GdipSaveImageToStream())
Le second paramètre (*newImage) de la fonction est l'identifiant GDI+ de l'image à ajouter à la séquence d'images.
Le dernier paramètre (encoderParams.EncoderParameters) est une variable de type EncoderParameters (ce n'est pas un pointeur).

Ce dernier paramètre possède deux éléments :
Le paramètre Count.l indique le nombre d'éléments du tableau Parameter.EncoderParameter qui est le deuxième élément de la structure EncoderParameters.
Le paramètre Parameter.EncoderParameter[1] est un tableau de structures EncoderParameter. Comme le nombre d'éléments de ce tableau n'est pas connu à l'avance, il est déclaré dans la structure avec un seul élément EncoderParameter. Si le nombre d'éléments est supérieur à 1, on utilisera un code similaire à celui donné après la définition de la structure EncoderParameters.
Le paramètre Parameter.EncoderParameter[1] permet de définir les valeurs requises par l'encodeur d'image utilisées pour l'opération de sauvegarde de l'image ajoutée à la séquence. L'encodeur sera également utilisé pour sauvegarder la première page, pour chaque ajout d'une page et également pour la fermeture du fichier qui est réalisée avec la fonction GdipSaveAdd().
Voici les différentes étapes à respecter pour sauvegarder une image au format Jpeg sans compression :
1. Retrouver un identifiant CLSID pour l'encodeur voulu.
    La procédure GetEncoderClsid(format.s, *Clsid.CLSID) de l'exemple permet de retrouver cet identifiant
2. Charger l'image
3. Remplir le tableau d'encoder (variable de type EncoderParameters) qui pour le cas de la sauvegarde d'une image Jpeg sans compression, n'a qu'un seul élément.
    Le premier élément de la structure EncoderParameters vaut 1 car il n'y a qu'un seul élément de type EncoderParameter.
    Le tableau EncoderParameter sera rempli comme ceci :
    L'élément Guid sera rempli avec a valeur de l'identifiant EncoderTransformation (la valeur est définie dans le fichier PB des GUID mais aussi en data pour l'exemple).
    Ce paramètre est rempli avec la commande PB CopyMemory().
    L'élément EncoderParameter\NumberOfValues est mis à 1car il indique le nombre d'éléments pointé par le membre *value de la structure qui est ici de 1.
    L'élément EncoderParameter\Type vaut #EncoderparameterValueTypeLong car le type de l'élément pointé par le membre *value de la structure est un mot de 32 bits.
    L'élément EncoderParameter\Value (pointeur) est l'adresse d'une variable de type long dont la valeur sera fixée à #EncoderValueCompressionNone (pas de compression).
4. Sauvegarde de l'image avec la fonction GdipSaveImageToStream().

Résultat de la fonction

Si la fonction réussit, elle retourne #Ok qui est une constante de l'énumération status.
Si la fonction échoue, elle retourne une des autres valeurs de l'énumération status.

PB - OS

PureBasic v4.30 bêta 4 (Windows - x86)
Testé avec Windows Vista édition familiale Premium