RIFF-Containermanipulation für WebP-Bilder.
Mux-API
Ermöglicht die Bearbeitung von WebP-Container-Images, die Features wie Farbprofil, Metadaten, Animation und fragmentierte Images enthalten.
Codebeispiele
Erstellen eines MUX mit Bilddaten, Farbprofil und XMP-Metadaten
int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICCP color profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);
Bild- und Farbprofildaten aus einer WebP-Datei abrufen
int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_data).
WebPMuxDelete(mux);
free(data);
Leben eines Mux-Objekts
Enums
// Error codes
typedef enum WebPMuxError {
WEBP_MUX_OK = 1,
WEBP_MUX_NOT_FOUND = 0,
WEBP_MUX_INVALID_ARGUMENT = -1,
WEBP_MUX_BAD_DATA = -2,
WEBP_MUX_MEMORY_ERROR = -3,
WEBP_MUX_NOT_ENOUGH_DATA = -4
} WebPMuxError;
// IDs for different types of chunks.
typedef enum WebPChunkId {
WEBP_CHUNK_VP8X, // VP8X
WEBP_CHUNK_ICCP, // ICCP
WEBP_CHUNK_ANIM, // ANIM
WEBP_CHUNK_ANMF, // ANMF
WEBP_CHUNK_ALPHA, // ALPH
WEBP_CHUNK_IMAGE, // VP8/VP8L
WEBP_CHUNK_EXIF, // EXIF
WEBP_CHUNK_XMP, // XMP
WEBP_CHUNK_UNKNOWN, // Other chunks.
WEBP_CHUNK_NIL
} WebPChunkId;
WebPGetMuxVersion()
Gibt die Versionsnummer der Mux-Bibliothek zurück, die in hexadezimal verpackt ist und jeweils 8 Bit für Haupt-, Neben- und Überarbeitungselemente verwendet wird. Beispiel: Version 2.5.7 ist 0x020507
.
int WebPGetMuxVersion(void);
WebPMuxNew()
Erstellt ein leeres mux-Objekt.
WebPMux* WebPMuxNew(void);
- Rückgaben
- Ein Zeiger auf das neu erstellte leere Mux-Objekt.
WebPMuxDelete()
Löscht das Mux-Objekt.
void WebPMuxDelete(WebPMux* mux);
- Parameter
- mux – Objekt, das gelöscht werden soll (Ein-/Ausgang)
Mux-Erstellung
WebPMuxCreate()
Erstellt ein Mux-Objekt aus Rohdaten, die im WebP RIFF-Format angegeben wurden.
WebPMux* WebPMuxCreate(const WebPData* bitstream, int copy_data);
- Parameter
bitstream – (in) die Bitstream-Daten im WebP-RIFF-Format
copy_data – (in) Wert 1 gibt an, dass bestimmte Daten in den Mux kopiert werden, und Wert 0 gibt an, dass Daten NICHT in das mux-Objekt kopiert werden.
- Rückgaben
Ein Zeiger auf das Mux-Objekt, das bei Erfolg aus den angegebenen Daten erstellt wurde.
NULL: bei ungültigen Daten oder Speicherfehlern.
Nicht-Image-Blöcke
WebPMuxSetChunk()
Fügt einen Chunk mit der ID fourcc und den Daten chunk_data im mux-Objekt hinzu. Alle vorhandenen Blöcke mit derselben ID werden entfernt.
WebPMuxError WebPMuxSetChunk(WebPMux* mux,
const char fourcc[4],
const WebPData* chunk_data,
int copy_data);
Hinweis: Nur Blöcke, die sich nicht auf Bilder beziehen, sollten über Chunk-APIs verwaltet werden.
Zu den bildbezogenen Teilstücken gehören "ANMF", "FRGM", "VP8 ", "VP8L" und "ALPH". Verwenden Sie zum Hinzufügen, Abrufen und Löschen von Bildern WebPMuxSetImage()
, WebPMuxPushFrame()
, WebPMuxGetFrame()
und WebPMuxDeleteFrame()
.
- Parameter
mux – Ein-/Ausgangsobjekt, dem der Chunk hinzugefügt werden soll.
fourcc – (in) ein Zeichenarray, das die Fourcc des angegebenen Chunks enthält, z.B. „ICCP“, „XMP“, „EXIF“ usw.
chunk_data – (in) die hinzuzufügenden Chunk-Daten
copy_data – (in) Wert 1 gibt an, dass bestimmte Daten in den Mux kopiert werden, und Wert 0 gibt an, dass Daten NICHT in das mux-Objekt kopiert werden.
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux, viercc oder chunk_data NULL sind oder wenn fourcc einem Bildblock entspricht.WEBP_MUX_MEMORY_ERROR
: bei einem Fehler bei der Arbeitsspeicherzuweisung.WEBP_MUX_OK
: bei Erfolg.
WebPMuxGetChunk()
Ruft einen Verweis auf die Daten des Chunks mit der ID fourcc im Mux-Objekt ab. Der Aufrufer sollte die zurückgegebenen Daten NICHT freigeben.
WebPMuxError WebPMuxGetChunk(const WebPMux* mux,
const char fourcc[4],
WebPData* chunk_data);
- Parameter
mux – (in), von dem die Blockdaten abgerufen werden sollen
fourcc – (in) ein Zeichenarray, das die Fourcc des Blocks enthält, z.B. „ICCP“, „XMP“, „EXIF“ usw.
chunk_data – (out) zurückgegebene Chunk-Daten
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux, viercc oder chunk_data NULL sind oder wenn fourcc einem Bildblock entspricht.WEBP_MUX_NOT_FOUND
: Wenn mux keinen Chunk mit der angegebenen ID enthält.WEBP_MUX_OK
: bei Erfolg.
WebPMuxDeleteChunk()
Löscht den Chunk mit dem angegebenen fourcc aus dem mux-Objekt.
WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]);
- Parameter
mux – Ein-/Ausgangsobjekt, aus dem der Block gelöscht werden soll.
fourcc – (in) ein Zeichenarray, das die Fourcc des Blocks enthält, z.B. „ICCP“, „XMP“, „EXIF“ usw.
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn „mux“ oder „viercc“ den Wert NULL hat oder wenn „viercc“ einem Bildblock entspricht.WEBP_MUX_NOT_FOUND
: Wenn mux keinen Chunk mit der angegebenen Fourcc enthält.WEBP_MUX_OK
: bei Erfolg.
Bilder
Kapselt Daten zu einem einzelnen Frame/Fragment.
struct WebPMuxFrameInfo {
WebPData bitstream; // image data: can be a raw VP8/VP8L bitstream
// or a single-image WebP file.
int x_offset; // x-offset of the frame.
int y_offset; // y-offset of the frame.
int duration; // duration of the frame (in milliseconds).
WebPChunkId id; // frame type: should be one of WEBP_CHUNK_ANMF,
// WEBP_CHUNK_FRGM or WEBP_CHUNK_IMAGE
WebPMuxAnimDispose dispose_method; // Disposal method for the frame.
WebPMuxAnimBlend blend_method; // Blend operation for the frame.
};
WebPMuxSetImage()
Legt das (nicht animierte und nicht fragmentierte) Bild im mux-Objekt fest. Hinweis:Alle vorhandenen Bilder, einschließlich Frames und Fragmente, werden entfernt.
WebPMuxError WebPMuxSetImage(WebPMux* mux,
const WebPData* bitstream,
int copy_data);
- Parameter
mux – Objekt, in dem das Bild festgelegt werden soll.
bitstream – (in) kann ein unformatierter VP8-/VP8L-Bitstream oder eine WebP-Datei mit einem einzelnen Bild (nicht animiert und nicht fragmentiert) sein.
copy_data – (in) Wert 1 gibt an, dass bestimmte Daten in den Mux kopiert werden, und Wert 0 gibt an, dass Daten NICHT in das mux-Objekt kopiert werden.
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux NULL ist oder der Bitstream NULL ist.WEBP_MUX_MEMORY_ERROR
: bei einem Fehler bei der Arbeitsspeicherzuweisung.WEBP_MUX_OK
: bei Erfolg.
WebPMuxPushFrame()
Fügt einen Frame am Ende des Mux-Objekts hinzu.
WebPMuxError WebPMuxPushFrame(WebPMux* mux,
const WebPMuxFrameInfo* frame,
int copy_data);
Hinweise:
- Frame.id muss
WEBP_CHUNK_ANMF
oderWEBP_CHUNK_FRGM
sein. - Wenn du ein nicht animiertes, nicht fragmentiertes Bild festlegen möchtest, verwende stattdessen
WebPMuxSetImage()
. - Der Typ des übertragenen Frames muss mit dem Frame in mux übereinstimmen.
- Da WebP nur gerade Offsets unterstützt, wird jeder ungerade Offset mithilfe von: offset &= ~1 an einer geraden Position ausgerichtet.
- Parameter
mux – Ein-/Ausgangsobjekt, dem der Frame hinzugefügt werden soll.
frame – (in) Frame-Daten
copy_data – (in) Wert 1 gibt an, dass bestimmte Daten in den Mux kopiert werden, und Wert 0 gibt an, dass Daten NICHT in das mux-Objekt kopiert werden.
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux oder Frame NULL ist oder wenn der Inhalt des frames ungültig ist.WEBP_MUX_MEMORY_ERROR
: bei einem Fehler bei der Arbeitsspeicherzuweisung.WEBP_MUX_OK
: bei Erfolg.WEBP_MUX_MEMORY_ERROR
: bei einem Fehler bei der Arbeitsspeicherzuweisung.
WebPMuxGetFrame()
Ruft den n-ten Frame aus dem Mux-Objekt ab. Der Inhalt von frame->bitstream wird mithilfe von malloc() zugewiesen und NICHT dem Objekt mux gehört. Sie MUSS vom Aufrufer durch Aufrufen von WebPDataClear()
aufgehoben werden. hat nth=0 eine
besondere Bedeutung: die letzte Position.
WebPMuxError WebPMuxGetFrame(const WebPMux* mux,
uint32_t nth,
WebPMuxFrameInfo* frame);
- Parameter
mux – (in), von dem die Informationen abgerufen werden sollen
nth – (in) Index des Frames im Mux-Objekt
frame – Daten des zurückgegebenen Frames (aus)
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn Mux oder Frame NULL ist.WEBP_MUX_NOT_FOUND
: Wenn das mux-Objekt weniger als n-te Frames enthält.WEBP_MUX_BAD_DATA
: Wenn der n-te Frame-Chunk in mux ungültig ist.WEBP_MUX_OK
: bei Erfolg.
WebPMuxDeleteFrame()
Löscht einen Frame aus dem Mux-Objekt. "nth=0" hat eine besondere Bedeutung: "Letzte Position".
WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
- Parameter
mux – Ein-/Ausgangsobjekt, aus dem ein Frame gelöscht werden soll.
nth – (in) die Position, von der aus der Frame gelöscht werden soll.
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux NULL ist.WEBP_MUX_NOT_FOUND
: Wenn vor dem Löschen weniger als n-te Frames im Mux-Objekt vorhanden sind.WEBP_MUX_OK
: bei Erfolg.
Animation
Animationsparameter
struct WebPMuxAnimParams {
uint32_t bgcolor; // Background color of the canvas stored (in MSB order) as:
// Bits 00 to 07: Alpha.
// Bits 08 to 15: Red.
// Bits 16 to 23: Green.
// Bits 24 to 31: Blue.
int loop_count; // Number of times to repeat the animation [0 = infinite].
};
WebPMuxSetAnimationParams()
Legt die Animationsparameter im Mux-Objekt fest. Alle vorhandenen ANIM-Blöcke werden entfernt.
WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
const WebPMuxAnimParams* params);
- Parameter
mux – Objekt, in dem ein ANIM-Chunk festgelegt/hinzugefügt werden soll.
params – (in) Animationsparameter.
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux oder params den Wert NULL hat.WEBP_MUX_MEMORY_ERROR
: bei einem Fehler bei der Arbeitsspeicherzuweisung.WEBP_MUX_OK
: bei Erfolg.
WebPMuxGetAnimationParams()
Ruft die Animationsparameter aus dem mux-Objekt ab.
WebPMuxError WebPMuxGetAnimationParams(const WebPMux* mux,
WebPMuxAnimParams* params);
- Parameter
mux – (in), von dem die Animationsparameter abgerufen werden sollen
params -- (out) Animationsparameter, die aus dem ANIM-Chunk extrahiert wurden
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux oder params den Wert NULL hat.WEBP_MUX_NOT_FOUND
: Wenn der ANIM-Chunk nicht im Mux-Objekt vorhanden ist.WEBP_MUX_OK
: bei Erfolg.
Sonstige Dienstprogramme
WebPMuxGetCanvasSize()
Ruft die Canvasgröße aus dem Mux-Objekt ab.
WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
int* width,
int* height);
Hinweis:Bei dieser Methode wird davon ausgegangen, dass der VP8X-Chunk, falls vorhanden, aktuell ist.
Das heißt, das Mux-Objekt wurde seit dem letzten Aufruf von WebPMuxAssemble()
oder WebPMuxCreate()
nicht geändert.
- Parameter
mux – Objekt (in), aus dem die Canvasgröße abgerufen werden soll
width – (aus) Canvasbreite
height – (out) Höhe der Leinwand
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux ist, sind Breite oder Höhe NULL.WEBP_MUX_BAD_DATA
: wenn die Chunk- oder Canvasgröße für VP8X/VP8/VP8L ungültig ist.WEBP_MUX_OK
: bei Erfolg.
WebPMuxGetFeatures()
Ruft die Funktions-Flags aus dem Mux-Objekt ab.
WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags);
Hinweis:Bei dieser Methode wird davon ausgegangen, dass der VP8X-Chunk, falls vorhanden, aktuell ist.
Das heißt, das Mux-Objekt wurde seit dem letzten Aufruf von WebPMuxAssemble()
oder WebPMuxCreate()
nicht geändert.
- Parameter
mux – (in), aus dem die Merkmale abgerufen werden sollen
flags – (out) die Flags, die angeben, welche Merkmale im Mux-Objekt vorhanden sind. Dies ist eine ODER mit verschiedenen Flag-Werten. Mit dem Enum
WebPFeatureFlags
können einzelne Flag-Werte getestet werden.- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux oder Flags NULL sind.WEBP_MUX_BAD_DATA
: wenn die Chunk- oder Canvasgröße für VP8X/VP8/VP8L ungültig ist.WEBP_MUX_OK
: bei Erfolg.
WebPMuxNumChunks()
Ruft die Anzahl der Blöcke mit dem angegebenen Tag-Wert im mux-Objekt ab.
WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
WebPChunkId id,
int* num_elements);
- Parameter
mux – (in), von dem die Informationen abgerufen werden sollen
id – Die Chunk-ID (in), die den Typ des Chunks angibt.
num_elements – (out) Anzahl der Blöcke mit der angegebenen Chunk-ID
- Rückgaben
WEBP_MUX_INVALID_ARGUMENT
: Wenn mux oder num_elements NULL ist.WEBP_MUX_OK
: bei Erfolg.
WebPMuxAssemble()
Stellt alle Blöcke im WebP-RIFF-Format zusammen und gibt sie in assembled_data zurück. Diese Funktion validiert auch das mux-Objekt.
WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data);
Hinweis:Der Inhalt von assed_data wird ignoriert und überschrieben.
Außerdem wird der Inhalt von assembled_data mit Malloc() zugewiesen und NICHT dem Objekt assembled_data gehören. Sie MUSS vom Aufrufer freigegeben werden, indem er WebPDataClear()
aufruft.
- Parameter
mux – Objekt (in/out), dessen Chunks zusammengestellt werden sollen.
assembled_data – (out) zusammengestellte WebP-Daten
- Rückgaben
WEBP_MUX_BAD_DATA
: Wenn das Mux-Objekt ungültig ist.WEBP_MUX_INVALID_ARGUMENT
: Wenn mux oder assed_data NULL ist.WEBP_MUX_MEMORY_ERROR
: bei einem Fehler bei der Arbeitsspeicherzuweisung.WEBP_MUX_OK
: bei Erfolg.
WebPAnimEncoder-API
Diese API ermöglicht die Codierung animierter WebP-Bilder (möglicherweise).
Codebeispiel
WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// Tune 'enc_options' as needed.
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
WebPConfig config;
WebPConfigInit(&config);
// Tune 'config' as needed.
WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config);
}
WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL);
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// Write the 'webp_data' to a file, or re-mux it further.
typedef struct WebPAnimEncoder WebPAnimEncoder; // Main opaque object.
Globale Optionen
struct WebPAnimEncoderOptions {
WebPMuxAnimParams anim_params; // Animation parameters.
int minimize_size; // If true, minimize the output size (slow). Implicitly
// disables key-frame insertion.
int kmin;
int kmax; // Minimum and maximum distance between consecutive key
// frames in the output. The library may insert some key
// frames as needed to satisfy this criteria.
// Note that these conditions should hold: kmax > kmin
// and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then
// key-frame insertion is disabled; and if kmax == 1,
// then all frames will be key-frames (kmin value does
// not matter for these special cases).
int allow_mixed; // If true, use mixed compression mode; may choose
// either lossy and lossless for each frame.
int verbose; // If true, print info and warning messages to stderr.
};
WebPAnimEncoderOptionsInit()
Sollte immer aufgerufen werden, um vor der Änderung eine neue WebPAnimEncoderOptions-Struktur zu initialisieren. Gibt "false" zurück, falls Versionsdiskrepanzen auftreten. WebPAnimEncoderOptionsInit() muss erfolgreich gewesen sein, bevor das Objekt enc_options verwendet werden konnte.
- Parameter
- enc_options: Optionen zum Ein- und Ausschalten der Animation
- Rückgaben
- „True“, wenn der Vorgang erfolgreich war.
int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderNew()
Erstellt und initialisiert ein WebPAnimEncoder-Objekt.
- Parameter
width/height: (in Zoll) Breite und Höhe der Animation
enc_options -- (in) Codierungsoptionen; kann NULL übergeben werden, um angemessene Standardwerte auszuwählen.
- Rückgaben
Ein Zeiger auf das neu erstellte WebPAnimEncoder-Objekt oder NULL bei einem Speicherfehler.
WebPAnimEncoder* WebPAnimEncoderNew(
int width, int height, const WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderAdd()
Optimieren Sie den gegebenen Frame für WebP, codieren Sie ihn und fügen Sie ihn dem Objekt WebPAnimEncoder hinzu.
Der letzte Aufruf von WebPAnimEncoderAdd sollte mit frame = NULL
erfolgen. Damit wird angezeigt, dass keine weiteren Frames hinzugefügt werden sollen. Mit diesem Aufruf wird auch die Dauer des letzten Frames ermittelt.
- Parameter
enc – Ein-/Ausgangsobjekt, dem der Frame hinzugefügt werden soll.
frame: (Ein-/Ausgang)-Framedaten im ARGB- oder YUV(A)-Format Liegt sie im YUV(A)-Format vor, wird sie in ARGB konvertiert, wodurch ein geringer Verlust entsteht.
timestamp_ms – Der Zeitstempel (in) dieses Frames in Millisekunden. Die Dauer eines Frames wird als „Zeitstempel des nächsten Frames – Zeitstempel dieses Frames“ berechnet. Daher sollten die Zeitstempel in nicht absteigender Reihenfolge angeordnet sein.
config -- (in)-Codierungsoptionen; kann NULL übergeben werden, um angemessene Standardwerte auszuwählen.
- Rückgaben
Bei einem Fehler wird "false" zurückgegeben und
frame->error_code
ist entsprechend festgelegt. Andernfalls wird „true“ zurückgegeben.
int WebPAnimEncoderAdd(
WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
const struct WebPConfig* config);
WebPAnimEncoderAssemble()
Alle bisher hinzugefügten Frames zu einem WebP-Bitstream zusammenstellen Diesem Aufruf sollte ein Aufruf von WebPAnimEncoderAdd mit frame = NULL
vorausgehen. Andernfalls wird die Dauer des letzten Frames intern geschätzt.
- Parameter
enc – Ein-/Ausgangsobjekt, aus dem die Frames zusammengesetzt werden sollen.
webp_data – (out) der generierte WebP-Bitstream.
- Rückgaben
True bei Erfolg.
int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data);
WebPAnimEncoderGetError()
Rufen Sie mit enc den Fehlerstring ab, der dem letzten Aufruf entspricht. Der zurückgegebene String gehört enc und ist nur bis zum nächsten Aufruf von WebPAnimEncoderAdd()
, WebPAnimEncoderAssemble()
oder WebPAnimEncoderDelete()
gültig.
- Parameter
- enc: Objekt, aus dem der Fehlerstring abgerufen werden soll.
- Rückgaben
- NULL if enc is NULL. Andernfalls wird der Fehlerstring zurückgegeben, wenn beim letzten Aufruf von enc ein Fehler aufgetreten ist. Wenn der letzte Aufruf erfolgreich war, wird ein leerer String zurückgegeben.
const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
WebPAnimEncoderDelete()
Löscht das Objekt WebPAnimEncoder.
- Parameter
- enc – (Ein-/Ausgang) Objekt, das gelöscht werden soll
void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
Demux-API
Ermöglicht die Extraktion von Bilddaten und Daten im erweiterten Format aus WebP-Dateien.
Codebeispiele
Demuxing von WebP-Daten zum Extrahieren aller Frames, des ICC-Profils und der EXIF/XMP-Metadaten
WebPDemuxer* demux = WebPDemux(&webp_data);
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
do {
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
// ... and get other frame properties like width, height, offsets etc.
// ... see 'struct WebPIterator' below for more info).
} while (WebPDemuxNextFrame(&iter));
WebPDemuxReleaseIterator(&iter);
}
// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);
Leben eines Demux-Objekts
Enums
typedef enum WebPDemuxState {
WEBP_DEMUX_PARSE_ERROR = -1, // An error occurred while parsing.
WEBP_DEMUX_PARSING_HEADER = 0, // Not enough data to parse full header.
WEBP_DEMUX_PARSED_HEADER = 1, // Header parsing complete,
// data may be available.
WEBP_DEMUX_DONE = 2 // Entire file has been parsed.
} WebPDemuxState;
WebPGetDemuxVersion()
Gibt die Versionsnummer der Demux-Bibliothek zurück, gepackt in hexadezimal mit 8 Bit für jede von Haupt-/Nebenversions-/Versionsangabe. Beispiel: Version 2.5.7 ist 0x020507
.
int WebPGetDemuxVersion(void);
WebPDemux()
Parst die vollständige WebP-Datei, die von data ausgegeben wird.
WebPDemuxer WebPDemux(const WebPData* data);
Gibt nach einem erfolgreichen Parsen ein WebPDemuxer
-Objekt zurück, andernfalls NULL.
WebPDemuxPartial()
Parst die möglicherweise unvollständige WebP-Datei aus data. Wenn der state nicht NULL ist, wird er festgelegt, um den Status des Demuxer anzugeben.
WebPDemuxer WebPDemuxPartial(const WebPData* data, WebPDemuxState* state);
Gibt NULL zurück, wenn ein Fehler auftritt oder nicht genügend Daten zum Starten des Parsens vorhanden sind. Bei erfolgreicher Analyse wird ein WebPDemuxer
-Objekt zurückgegeben.
Beachten Sie, dass WebPDemuxer
interne Zeiger auf das Datenspeichersegment behält. Wenn diese Daten flüchtig sind, sollte das Demuxerobjekt durch Aufrufen von WebPDemuxDelete()
gelöscht und WebPDemuxPartial()
für die neuen Daten noch einmal aufgerufen werden. Dies ist in der Regel ein kostengünstiger Vorgang.
WebPDemuxDelete()
Gibt den mit dmux verknüpften Arbeitsspeicher frei.
void WebPDemuxDelete(WebPDemuxer* dmux);
Daten-/Informationsextraktion
typedef enum WebPFormatFeature {
WEBP_FF_FORMAT_FLAGS, // bit-wise combination of WebPFeatureFlags
// corresponding to the 'VP8X' chunk (if present).
WEBP_FF_CANVAS_WIDTH,
WEBP_FF_CANVAS_HEIGHT,
WEBP_FF_LOOP_COUNT, // only relevant for animated file
WEBP_FF_BACKGROUND_COLOR, // idem.
WEBP_FF_FRAME_COUNT // Number of frames present in the demux object.
// In case of a partial demux, this is the number
// of frames seen so far, with the last frame
// possibly being partial.
} WebPFormatFeature;
WebPDemuxGetI()
Rufen Sie den feature-Wert aus dem dmux ab.
uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature);
Hinweis: Werte sind nur gültig, wenn WebPDemux()
verwendet wurde oder WebPDemuxPartial()
einen Status > WEBP_DEMUX_PARSING_HEADER
zurückgegeben hat.
Frame-Iteration
struct WebPIterator {
int frame_num;
int num_frames; // equivalent to WEBP_FF_FRAME_COUNT.
int fragment_num;
int num_fragments;
int x_offset, y_offset; // offset relative to the canvas.
int width, height; // dimensions of this frame or fragment.
int duration; // display duration in milliseconds.
WebPMuxAnimDispose dispose_method; // dispose method for the frame.
int complete; // true if 'fragment' contains a full frame. partial images
// may still be decoded with the WebP incremental decoder.
WebPData fragment; // The frame or fragment given by 'frame_num' and
// 'fragment_num'.
int has_alpha; // True if the frame or fragment contains transparency.
WebPMuxAnimBlend blend_method; // Blend operation for the frame.
};
WebPDemuxGetFrame()
Ruft den Frame frame_number von dmux ab.
int WebPDemuxGetFrame(const WebPDemuxer* dmux,
int frame_number,
WebPIterator* iter);
iter->fragment verweist nach der Rückgabe von dieser Funktion auf das erste Fragment.
Einzelne Fragmente können mit WebPDemuxSelectFragment()
extrahiert werden. Wenn Sie frame_number auf 0 setzen, wird der letzte Frame des Bildes zurückgegeben.
Gibt "false" zurück, wenn dmux NULL ist oder Frame frame_number nicht vorhanden ist.
Rufen Sie WebPDemuxReleaseIterator()
auf, wenn die Verwendung des Listeners abgeschlossen ist.
Hinweis:dmux muss für die Lebensdauer von iter bestehen bleiben.
WebPDemuxNextFrame()
, WebPDemuxPrevFrame()
Legt fest, dass iter->fragment auf den nächsten Frame (iter->frame_num + 1) oder den vorherigen Frame (iter->frame_num - 1) verweist. Diese Funktionen werden nicht in Schleifen ausgeführt.
int WebPDemuxNextFrame(WebPIterator* iter);
int WebPDemuxPrevFrame(WebPIterator* iter);
Gibt bei Erfolg „true“, andernfalls „false“ zurück.
WebPDemuxSelectFragment()
Legt iter->fragment so fest, dass die Fragmentnummer fragment_num widergespiegelt wird.
int WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);
Gibt „true“ zurück, wenn das Fragment fragment_num vorhanden ist, andernfalls „false“.
WebPDemuxReleaseIterator()
Gibt jeden mit iter verknüpften Speicher frei.
void WebPDemuxReleaseIterator(WebPIterator* iter);
Muss vor allen nachfolgenden Aufrufen von WebPDemuxGetChunk()
für denselben Iteration aufgerufen werden. Muss außerdem aufgerufen werden, bevor das verknüpfte WebPDemuxer
mit WebPDemuxDelete()
gelöscht wird.
Chunk-Iteration
struct WebPChunkIterator {
// The current and total number of chunks with the fourcc given to
// WebPDemuxGetChunk().
int chunk_num;
int num_chunks;
WebPData chunk; // The payload of the chunk.
};
WebPDemuxGetChunk()
Ruft die chunk_number-Instanz des Chunks mit der ID fourcc von dmux ab.
int WebPDemuxGetChunk(const WebPDemuxer* dmux,
const char fourcc[4], int chunk_number,
WebPChunkIterator* iter);
fourcc ist ein Zeichenarray, das die Fourcc des zurückzugebenden Blocks enthält, z.B. "ICCP", "XMP ", "EXIF" usw.
Wenn für chunk_number gleich 0 festgelegt wird, wird der letzte Teil in einem Satz zurückgegeben.
Gibt „true“ zurück, wenn der Chunk gefunden wird, andernfalls „false“. Auf Image-bezogene Chunk-Nutzlasten kann über WebPDemuxGetFrame()
und zugehörige Funktionen zugegriffen werden. Rufen Sie WebPDemuxReleaseChunkIterator()
auf, wenn die Verwendung des Iteration abgeschlossen ist.
Hinweis:dmux muss für die Lebensdauer des Iterators bestehen bleiben.
WebPDemuxNextChunk()
, WebPDemuxPrevChunk()
Legt fest, dass iter->chunk auf den nächsten (iter->chunk_num + 1) oder den vorherigen (iter->chunk_num - 1) verweist. Diese Funktionen werden nicht in Schleifen ausgeführt.
int WebPDemuxNextChunk(WebPChunkIterator* iter);
int WebPDemuxPrevChunk(WebPChunkIterator* iter);
Gibt bei Erfolg „true“, andernfalls „false“ zurück.
WebPDemuxReleaseChunkIterator()
Gibt jeden mit iter verknüpften Speicher frei.
void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);
Muss aufgerufen werden, bevor die verknüpfte WebPDemuxer
mit WebPDemuxDelete()
gelöscht wird.
WebPAnimDecoder API
Diese API ermöglicht die Decodierung animierter WebP-Bilder (möglicherweise).
Codebeispiel
WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
while (WebPAnimDecoderHasMoreFrames(dec)) {
uint8_t* buf;
int timestamp;
WebPAnimDecoderGetNext(dec, &buf, ×tamp);
// ... (Render 'buf' based on 'timestamp').
// ... (Do NOT free 'buf', as it is owned by 'dec').
}
WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);
typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object.
Globale Optionen
struct WebPAnimDecoderOptions {
// Output colorspace. Only the following modes are supported:
// MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA.
WEBP_CSP_MODE color_mode;
int use_threads; // If true, use multi-threaded decoding.
};
WebPAnimDecoderOptionsInit()
Sollte immer aufgerufen werden, um vor der Änderung eine neue WebPAnimDecoderOptions-Struktur zu initialisieren. Gibt "false" zurück, falls Versionsdiskrepanzen auftreten. WebPAnimDecoderOptionsInit() muss erfolgreich gewesen sein, bevor das Objekt dec_options verwendet werden konnte.
Parameter
dec_options – Ein-/Aus-Optionen, die zum Decodieren der Animation verwendet werden
- Rückgaben
- Bei Erfolg wahr
int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options);
WebPAnimDecoderNew()
Erstellt und initialisiert ein WebPAnimDecoder-Objekt.
- Parameter
webp_data – (in) WebP-Bitstream. Dies sollte während der Lebensdauer des WebPAnimDecoder-Ausgabeobjekts unverändert bleiben.
dec_options – (in) Decodierungsoptionen. Kann NULL übergeben werden, um angemessene Standardeinstellungen auszuwählen (insbesondere der Farbmodus MODE_RGBA wird ausgewählt).
- Rückgaben
Ein Zeiger auf das neu erstellte WebPAnimDecoder-Objekt oder NULL bei einem Parsing-Fehler, einer ungültigen Option oder einem Speicherfehler.
WebPAnimDecoder* WebPAnimDecoderNew(
const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options);
Globale Informationen zur Animation.
struct WebPAnimInfo {
uint32_t canvas_width;
uint32_t canvas_height;
uint32_t loop_count;
uint32_t bgcolor;
uint32_t frame_count;
};
WebPAnimDecoderGetInfo()
Rufen Sie globale Informationen zur Animation ab.
- Parameter
dec – (in) Decoderinstanz, von der Informationen abgerufen werden sollen.
info – (out) globale Informationen, die aus der Animation abgerufen werden.
- Rückgaben
True bei Erfolg.
int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
WebPAnimInfo* info);
WebPAnimDecoderGetNext()
Ruft den nächsten Frame anhand der für WebPAnimDecoderNew()
angegebenen Optionen von dec ab. Dies ist ein vollständig rekonstruiertes Canvas der Größe canvas_width * 4 * canvas_height
und nicht nur das Unterrechteck des Frames. Der zurückgegebene Zwischenspeicher buf ist nur bis zum nächsten Aufruf von WebPAnimDecoderGetNext()
, WebPAnimDecoderReset()
oder WebPAnimDecoderDelete()
gültig.
- Parameter
dec – (Ein-/Ausgang)-Decoderinstanz, von der der nächste Frame abgerufen werden soll.
buf – (out)-decodierter Frame.
timestamp – (out) Zeitstempel des Frames in Millisekunden.
- Rückgaben
False, wenn eines der Argumente NULL ist, ein Analyse- oder Decodierungsfehler auftritt oder keine Frames mehr vorhanden sind. Andernfalls wird „true“ zurückgegeben.
int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
uint8_t** buf, int* timestamp);
WebPAnimDecoderHasMoreFrames()
Prüfen Sie, ob mehr Frames decodiert werden müssen.
- Parameter
- dec – (in) die zu prüfende Decoderinstanz.
- Rückgaben
- „True“, wenn dec nicht NULL ist und einige Frames noch decodiert werden müssen. Andernfalls wird "false" zurückgegeben.
int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
WebPAnimDecoderReset()
Setzt das WebPAnimDecoder-Objekt zurück, sodass beim nächsten Aufruf von WebPAnimDecoderGetNext()
die Decodierung vom 1. Frame neu gestartet wird. Dies ist hilfreich, wenn alle Frames mehrmals decodiert werden müssen (z.B. mit info.loop_count-Mal), ohne das Objekt dec zu zerstören und neu zu erstellen.
- Parameter
- dec – (Ein-/Ausgang)-Decoderinstanz, die zurückgesetzt werden soll
void WebPAnimDecoderReset(WebPAnimDecoder* dec);
WebPAnimDecoderGetDemuxer()
Greifen Sie das interne Demuxer-Objekt zu.
Das Abrufen des Demuxer-Objekts kann nützlich sein, wenn Sie Vorgänge verwenden möchten, die nur über den Demuxer verfügbar sind, z.B. um XMP/EXIF/ICC-Metadaten abzurufen. Das zurückgegebene Demuxer-Objekt gehört zu dec und ist nur bis zum nächsten Aufruf von WebPAnimDecoderDelete()
gültig.
- Parameter
- dec – (in) Decoderinstanz, aus der das Demuxerobjekt abgerufen werden soll.
const WebPDemuxer* WebPAnimDecoderGetDemuxer(const WebPAnimDecoder* dec);
WebPAnimDecoderDelete()
Löscht das Objekt WebPAnimDecoder.
- Parameter
- dec – (Ein-/Ausgang)-Decoderinstanz, die gelöscht werden soll.
- Rückgaben
- „True“, wenn der Vorgang erfolgreich war.
void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
Gängige Datentypen
Enums
typedef enum WebPFeatureFlags {
FRAGMENTS_FLAG = 0x00000001,
ANIMATION_FLAG = 0x00000002,
XMP_FLAG = 0x00000004,
EXIF_FLAG = 0x00000008,
ALPHA_FLAG = 0x00000010,
ICCP_FLAG = 0x00000020
} WebPFeatureFlags;
// Dispose method (animation only). Indicates how the area used by the current
// frame is to be treated before rendering the next frame on the canvas.
typedef enum WebPMuxAnimDispose {
WEBP_MUX_DISPOSE_NONE, // Do not dispose.
WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color.
} WebPMuxAnimDispose;
// Blend operation (animation only). Indicates how transparent pixels of the
// current frame are blended with those of the previous canvas.
typedef enum WebPMuxAnimBlend {
WEBP_MUX_BLEND, // Blend.
WEBP_MUX_NO_BLEND // Do not blend.
} WebPMuxAnimBlend;
WebPDataInit()
Initialisiert den Inhalt des Objekts webp_data mit Standardwerten.
void WebPDataInit(WebPData* webp_data);
WebPDataClear()
Löscht den Inhalt des Objekts webp_data durch Aufrufen von free()
. Die Zuweisung des Objekts selbst wird nicht aufgehoben.
void WebPDataClear(WebPData* webp_data);
WebPDataCopy()
Ordnet den erforderlichen Speicher für dst zu und kopiert den Inhalt von src. Gibt bei Erfolg „true“ zurück.
int WebPDataCopy(const WebPData* src, WebPData* dst);