מניפולציה של מאגר RIFF עבור תמונות WebP.
ממשק API של Mux
מאפשרת לבצע פעולות על תמונות קונטיינרים של WebP, שמכילות תכונות כמו פרופיל צבעים, מטא-נתונים, אנימציה ותמונות מקוטעות.
דוגמאות לקוד
יצירת MUX עם נתוני תמונה, פרופיל צבע ומטא-נתונים של XMP
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);
קבלת נתוני פרופיל תמונה וצבע מקובץ WebP
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);
חייו של אובייקט Mux
טיפוסים בני מנייה (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()
הפונקציה מחזירה את מספר הגרסה של הספרייה mux, כשהיא ארוזה בהקסדצימלית תוך שימוש ב-8 ביטים לכל אחד מהמשימות הראשיות/המינוריות/הגרסאות הקודמות. למשל, גרסה 2.5.7 היא 0x020507
.
int WebPGetMuxVersion(void);
WebPMuxNew()
יוצר אובייקט mux ריק.
WebPMux* WebPMuxNew(void);
- החזרות
- הפניה לאובייקט ה-mux הריק החדש שנוצר.
WebPMuxDelete()
מחיקת אובייקט ה-mux.
void WebPMuxDelete(WebPMux* mux);
- פרמטרים
- mux – אובייקט (בתוך/מחוץ) למחיקה
יצירה של Mux
WebPMuxCreate()
יוצרת אובייקט mux מנתונים גולמיים בפורמט WebP RIFF.
WebPMux* WebPMuxCreate(const WebPData* bitstream, int copy_data);
- פרמטרים
bitstream -- (בתוך) נתוני ה-bitstream בפורמט WebP RIFF
copy_data – (ב) ערך 1 מציין שהנתונים הנתונים יועתקו ל-mux והערך 0 מציין שהנתונים לא יועתקו לאובייקט mux.
- החזרות
מצביע לאובייקט mux שנוצר מנתונים נתונים - בהצלחה.
NULL – במקרה של נתונים לא חוקיים או שגיאת זיכרון.
מקטעים שאינם תמונות
WebPMuxSetChunk()
מוסיף גוש עם המזהה fourcc ועם הנתונים chunk_data באובייקט ה-mux. המערכת תסיר את כל המקטעים הקיימים עם אותו מזהה.
WebPMuxError WebPMuxSetChunk(WebPMux* mux,
const char fourcc[4],
const WebPData* chunk_data,
int copy_data);
הערה: צריך לנהל רק מקטעים שאינם קשורים לתמונות באמצעות ממשקי API של מקטעים.
(מקטעים הקשורים לתמונות הם: ANMF, FRGM, VP8, VP8L ו-ALPH). כדי להוסיף,
לקבל ולמחוק תמונות, אפשר להשתמש ב-WebPMuxSetImage()
, ב-WebPMuxPushFrame()
, ב-WebPMuxGetFrame()
וב-WebPMuxDeleteFrame()
.
- פרמטרים
mux – אובייקט (in/out) שאליו יש להוסיף את המקטע
fourcc -- (ב) מערך תווים שמכיל את ה-4cc של הקטע הנתון. למשל, "ICCP", "XMP", "EXIF" וכו'.
chunk_data -- (ב) נתוני המקטע שיש להוסיף
copy_data – (ב) ערך 1 מציין שהנתונים הנתונים יועתקו ל-mux והערך 0 מציין שהנתונים לא יועתקו לאובייקט mux.
- החזרות
WEBP_MUX_INVALID_ARGUMENT
– אם ה-mux, ארבעהcc או chunk_data הם NULL או אם fourcc תואם לקבוצת תמונות.WEBP_MUX_MEMORY_ERROR
– עקב שגיאה בהקצאת הזיכרון.WEBP_MUX_OK
-- בהצלחה.
WebPMuxGetChunk()
הפונקציה מקבלת הפניה לנתונים של המקטע עם המזהה fourcc באובייקט ה-mux. המתקשר לא אמור לשחרר את הנתונים שהוחזרו.
WebPMuxError WebPMuxGetChunk(const WebPMux* mux,
const char fourcc[4],
WebPData* chunk_data);
- פרמטרים
mux -- (ב) האובייקט שממנו יש לאחזר את נתוני המקטע
fourcc -- (ב) מערך תווים שמכיל את ה-4cc של הקטע; למשל, "ICCP", "XMP", "EXIF" וכו'.
chunk_data -- (מ) החזירו נתוני מקטעים
- החזרות
WEBP_MUX_INVALID_ARGUMENT
– אם ה-mux, ארבעהcc או chunk_data הם NULL או אם fourcc תואם לקבוצת תמונות.WEBP_MUX_NOT_FOUND
– אם ה-mux לא מכיל גוש עם המזהה הנתון.WEBP_MUX_OK
-- בהצלחה.
WebPMuxDeleteChunk()
מחיקת המקטע עם ה-fourcc הנתון מאובייקט ה-mux.
WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]);
- פרמטרים
mux – אובייקט (פנימי/חיצוני) שממנו יש למחוק את המקטע
fourcc -- (ב) מערך תווים שמכיל את ה-4cc של הקטע; למשל, "ICCP", "XMP", "EXIF" וכו'.
- החזרות
WEBP_MUX_INVALID_ARGUMENT
– אם השדה mux או ארבעהcc הוא NULL, או אם הערך '4cc' תואם לקבוצת תמונות.WEBP_MUX_NOT_FOUND
– אם ה-mux לא מכיל גוש עם הרביעית הנתונה.WEBP_MUX_OK
-- בהצלחה.
תמונות
כוללת אנקפסולציה של נתונים לגבי מסגרת/קטע בודדים.
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()
מגדיר את התמונה (ללא אנימציה וללא פיצול) באובייקט ה-mux. הערה: כל התמונות הקיימות (כולל מסגרות/מקטעים) יוסרו.
WebPMuxError WebPMuxSetImage(WebPMux* mux,
const WebPData* bitstream,
int copy_data);
- פרמטרים
mux -- אובייקט שבו יש להגדיר את התמונה (in/out)
bitstream -- (ב) יכול להיות זרם ביט גולמי VP8/VP8L או קובץ WebP עם תמונה יחידה (לא מונפש וללא פיצולים)
copy_data – (ב) ערך 1 מציין שהנתונים הנתונים יועתקו ל-mux והערך 0 מציין שהנתונים לא יועתקו לאובייקט mux.
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם ה-mux הוא NULL או אם ה-bitstream הוא NULL.WEBP_MUX_MEMORY_ERROR
– עקב שגיאה בהקצאת הזיכרון.WEBP_MUX_OK
-- בהצלחה.
WebPMuxPushFrame()
מוסיף מסגרת בסוף אובייקט ה-mux.
WebPMuxError WebPMuxPushFrame(WebPMux* mux,
const WebPMuxFrameInfo* frame,
int copy_data);
הערות:
- frame.id צריך להיות אחד מהערכים
WEBP_CHUNK_ANMF
אוWEBP_CHUNK_FRGM
- כדי להגדיר תמונה ללא אנימציה וללא פיצולים, צריך להשתמש ב-
WebPMuxSetImage()
. - סוג המסגרת הנדחפת חייב להיות זהה למסגרות ב-mux.
- מאחר ש-WebP תומך רק בקיזוזים זוגיים, כל היסט אי-זוגי יוצמד למיקום זוגי באמצעות: היסט &= ~1
- פרמטרים
mux -- האובייקט (בתוך/מחוץ) שאליו יש להוסיף את המסגרת
frame -- (בתוך) נתוני המסגרת.
copy_data – (ב) ערך 1 מציין שהנתונים הנתונים יועתקו ל-mux והערך 0 מציין שהנתונים לא יועתקו לאובייקט mux.
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם ה-mux או המסגרת הם NULL או אם התוכן של המסגרת לא חוקי.WEBP_MUX_MEMORY_ERROR
– עקב שגיאה בהקצאת הזיכרון.WEBP_MUX_OK
-- בהצלחה.WEBP_MUX_MEMORY_ERROR
– עקב שגיאה בהקצאת הזיכרון.
WebPMuxGetFrame()
הפונקציה מקבלת את מסגרת ה-n מאובייקט ה-mux. התוכן של frame->bitstream מוקצה באמצעות Maloc() ולא בבעלות האובייקט mux. המתקשר חייב להקצות את המספר WebPDataClear()
. ל-nth=0
יש משמעות מיוחדת - מיקום אחרון.
WebPMuxError WebPMuxGetFrame(const WebPMux* mux,
uint32_t nth,
WebPMuxFrameInfo* frame);
- פרמטרים
mux – אובייקט (ב) שממנו יש לאחזר את המידע
nth -- האינדקס (in) של המסגרת באובייקט ה-mux
frame -- נתוני (out) של המסגרת שהוחזרה
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם mux או מסגרת הם NULL.WEBP_MUX_NOT_FOUND
-- אם יש פחות מ-n פריימים באובייקט ה-mux.WEBP_MUX_BAD_DATA
-- אם המקטע של מסגרת ה-n ב-mux לא חוקי.WEBP_MUX_OK
-- בהצלחה.
WebPMuxDeleteFrame()
מחיקת מסגרת מהאובייקט mux. ל-nth=0 יש משמעות מיוחדת – מיקום אחרון.
WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
- פרמטרים
mux – אובייקט (בתוך/מחוץ) שממנו יש למחוק את המסגרת
nth -- (ב) המיקום שממנו יש למחוק את המסגרת
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם mux הוא NULL.WEBP_MUX_NOT_FOUND
-- אם יש פחות מ-n פריימים באובייקט ה-mux לפני המחיקה.WEBP_MUX_OK
-- בהצלחה.
Animation
פרמטרים של אנימציה
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()
מגדיר את הפרמטרים של האנימציה באובייקט mux. מקטעי ANIM יוסרו.
WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
const WebPMuxAnimParams* params);
- פרמטרים
mux -- אובייקט (in/out) שבו יש להגדיר/להוסיף מקטע ANIM
params -- (בתוך) פרמטרים של אנימציה.
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם ה-mux או הפרמטרים הוא NULL.WEBP_MUX_MEMORY_ERROR
– עקב שגיאה בהקצאת הזיכרון.WEBP_MUX_OK
-- בהצלחה.
WebPMuxGetAnimationParams()
הפונקציה מקבלת את הפרמטרים של האנימציה מהאובייקט mux.
WebPMuxError WebPMuxGetAnimationParams(const WebPMux* mux,
WebPMuxAnimParams* params);
- פרמטרים
mux -- (ב) אובייקט שממנו יש לאחזר את הפרמטרים של האנימציה
params -- פרמטרים של אנימציה (יוצאים) שחולצו מקטע ה-ANIM
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם ה-mux או הפרמטרים הוא NULL.WEBP_MUX_NOT_FOUND
-- אם מקטע ANIM לא נמצא באובייקט mux.WEBP_MUX_OK
-- בהצלחה.
שירותים שונים
WebPMuxGetCanvasSize()
הפונקציה מקבלת את גודל הקנבס מאובייקט ה-mux.
WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
int* width,
int* height);
הערה: שיטה זו מבוססת על ההנחה שהקטע VP8X עדכני, אם קיים.
כלומר, האובייקט ב-mux לא השתנה מאז הקריאה האחרונה ל-WebPMuxAssemble()
או ל-WebPMuxCreate()
.
- פרמטרים
mux -- האובייקט (in) שממנו יש לאחזר את גודל הקנבס
width -- רוחב הקנבס (לא)
height – גובה הקנבס (מחוץ)
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם הרווח, הרוחב או הגובה הם NULL.WEBP_MUX_BAD_DATA
-- אם המקטעים VP8X/VP8/VP8L לא תקינים.WEBP_MUX_OK
-- בהצלחה.
WebPMuxGetFeatures()
הפונקציה מקבלת את הסימונים של פיצ'רים מהאובייקט ב-mux.
WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags);
הערה: שיטה זו מבוססת על ההנחה שהקטע VP8X עדכני, אם קיים.
כלומר, האובייקט ב-mux לא השתנה מאז הקריאה האחרונה ל-WebPMuxAssemble()
או ל-WebPMuxCreate()
.
- פרמטרים
mux -- (ב) האובייקט שממנו יש לאחזר את התכונות
flags -- (מהוצאים) את הדגלים שמציינים אילו תכונות נמצאות באובייקט המוקס. זהו OR של ערכי דגל שונים. אפשר להשתמש ב-Enum
WebPFeatureFlags
כדי לבדוק ערכים של דגלים נפרדים.- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם הערך של mux או דגלים הוא NULL.WEBP_MUX_BAD_DATA
-- אם המקטעים VP8X/VP8/VP8L לא תקינים.WEBP_MUX_OK
-- בהצלחה.
WebPMuxNumChunks()
הפונקציה מקבלת את מספר המקטעים עם ערך התג הנתון באובייקט mux.
WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
WebPChunkId id,
int* num_elements);
- פרמטרים
mux – אובייקט (ב) שממנו יש לאחזר את המידע
id -- מזהה המקטע (in) שמציין את סוג הגוש
num_elements – מספר המקטעים (חסר) עם מזהה המקטע הנתון
- החזרות
WEBP_MUX_INVALID_ARGUMENT
-- אם הערך של mux או num_elements הוא NULL.WEBP_MUX_OK
-- בהצלחה.
WebPMuxAssemble()
הפונקציה מרכיבה את כל המקטעים בפורמט WebP RIFF ומחזירה אותם בפורמט assembled_data. הפונקציה הזו גם מאמתת את האובייקט mux.
WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data);
הערה: המערכת תתעלם מהתוכן של assembled_data והוא יוחלף.
כמו כן, התוכן של assembled_data מוקצה באמצעות Maloc(), ולא בבעלות האובייקט mux. מבצע הקריאה החוזרת צריך לאתר את המספר
WebPDataClear()
.
- פרמטרים
mux – אובייקט (פנימי/מחוצה) שיש להרכיב את המקטעים שלו
assembled_data -- נתוני WebP שנאספו (לא)
- החזרות
WEBP_MUX_BAD_DATA
-- אם אובייקט mux לא חוקי.WEBP_MUX_INVALID_ARGUMENT
-- אם הערך של mux או assembled_data הוא NULL.WEBP_MUX_MEMORY_ERROR
– עקב שגיאה בהקצאת הזיכרון.WEBP_MUX_OK
-- בהצלחה.
ממשק API של WebPAnimEncoder
ה-API הזה מאפשר קידוד (אולי) של תמונות WebP מונפשות.
דוגמה לקוד
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.
אפשרויות גלובליות
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()
תמיד צריך להפעיל אותה, כדי לאתחל מבנה WebPAnimEncoderOptions חדש לפני השינוי. הפונקציה מחזירה את הערך False במקרה של חוסר התאמה בין גרסאות. לפני השימוש באובייקט enc_options, צריכה להיות בעיה ב-WebPAnimEncoderOptionsInit() .
- פרמטרים
- enc_options -- אפשרויות (in/out) המשמשות לקידוד אנימציה
- החזרות
- ההצלחה מובטחת.
int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderNew()
יוצר ומאתחל אובייקט WebPAnimEncoder.
- פרמטרים
width/height – (ב) הרוחב והגובה של האנימציה בבד הציור.
enc_options -- (ב) אפשרויות קידוד. ניתן להעביר את הערך NULL כדי לבחור ברירות מחדל הגיוניות.
- החזרות
מצביע על כך לאובייקט WebPAnimEncoder החדש שנוצר, או ל-NULL במקרה של שגיאת זיכרון.
WebPAnimEncoder* WebPAnimEncoderNew(
int width, int height, const WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderAdd()
מבצעים אופטימיזציה למסגרת הנתונה ל-WebP, לקודד אותה ולהוסיף אותה לאובייקט WebPAnimEncoder.
הקריאה האחרונה ל-WebPAnimEncoderAdd צריכה להתבצע עם frame = NULL
, שמעיד על כך שלא צריך להוסיף עוד מסגרות. הקריאה הזו משמשת גם לקביעת משך הזמן של הפריים האחרון.
- פרמטרים
enc -- האובייקט (in/out) שאליו יש להוסיף את המסגרת.
frame -- נתוני פריימים (בתוך/מחוץ) בפורמט ARGB או YUV(A). אם הוא בפורמט YUV(A), הוא מומר ל-ARGB, וכתוצאה מכך הפסד קטן.
timestamp_ms -- חותמת הזמן (ב) של המסגרת הזו באלפיות השנייה. משך של פריים יחושב לפי 'חותמת הזמן של הפריים הבא – חותמת הזמן של הפריים הזה'. לכן, חותמות הזמן צריכות להיות בסדר לא יורד.
config -- (ב) אפשרויות קידוד; אפשר להעביר את הערך NULL כדי לבחור ברירות מחדל סבירות.
- החזרות
אם מופיעה שגיאה, הפונקציה מחזירה את הערך False והמדיניות
frame->error_code
מוגדרת כראוי. אחרת, הפונקציה מחזירה את הערך True.
int WebPAnimEncoderAdd(
WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
const struct WebPConfig* config);
WebPAnimEncoderAssemble()
אפשר להרכיב את כל הפריימים שנוספו עד עכשיו ל-Bitstream של WebP. לפני הקריאה הזו אמורה להתבצע קריאה ל-WebPAnimEncoderAdd עם frame = NULL
. אם לא, הערך של משך הפריים האחרון יחושב באופן פנימי.
- פרמטרים
enc -- אובייקט (בתוך/מחוץ) שממנו יש להרכיב את המסגרות.
webp_data -- זרם ה-WebP של ה-WebP שנוצר (מחוץ).
- החזרות
כל הכבוד על ההצלחה.
int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data);
WebPAnimEncoderGetError()
קבלת מחרוזת השגיאה שתואמת לשיחה האחרונה באמצעות enc. המחרוזת שהוחזרה נמצאת בבעלות enc, והיא תקפה רק עד הקריאה הבאה אל WebPAnimEncoderAdd()
או אל
WebPAnimEncoderAssemble()
או אל WebPAnimEncoderDelete()
.
- פרמטרים
- enc -- אובייקט (in/out) שממנו יש לאחזר את מחרוזת השגיאה.
- החזרות
- NULL if enc is NULL. אחרת, הפונקציה מחזירה את מחרוזת השגיאה אם הקריאה האחרונה ל-enc כללה שגיאה, או מחרוזת ריקה אם הקריאה האחרונה בוצעה בהצלחה.
const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
WebPAnimEncoderDelete()
מוחק את האובייקט WebPAnimEncoder.
- פרמטרים
- enc -- אובייקט (בפנים/מחוץ) למחיקה
void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
Demux API
מאפשר חילוץ של נתוני תמונות ופורמטים מורחבים מקובצי WebP.
דוגמאות לקוד
ניקוי נתוני WebP כדי לחלץ את כל המסגרות, פרופיל ICC ומטא-נתונים של EXIF/XMP
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);
חייו של אובייקט Demux
טיפוסים בני מנייה (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()
הפונקציה מחזירה את מספר הגרסה של ספריית ה-demux, כשהיא ארוזה בהקסדצימלית תוך שימוש ב-8 ביטים לכל אחד מהתחומים המרכזיים/המינוריים/הגרסאות הקודמות. למשל, גרסה 2.5.7 היא 0x020507
.
int WebPGetDemuxVersion(void);
WebPDemux()
מנתח את קובץ ה-WebP המלא שניתן על ידי data.
WebPDemuxer WebPDemux(const WebPData* data);
מחזירה אובייקט WebPDemuxer
בניתוח מוצלח. אחרת, NULL.
WebPDemuxPartial()
מנתח את קובץ ה-WebP שעשוי להיות חלקי, כפי שנמסר על ידי data. אם state הוא לא NULL, הוא יוגדר כדי לציין את הסטטוס של הדמוקסר.
WebPDemuxer WebPDemuxPartial(const WebPData* data, WebPDemuxState* state);
הפונקציה מחזירה את הערך NULL במקרה של שגיאה או אם אין מספיק נתונים כדי להתחיל בניתוח,
ופונקציה WebPDemuxer
בניתוח מוצלח.
הערה: התכונה WebPDemuxer
שומרת את ההפניות הפנימיות לפלח הזיכרון נתונים. אם יש תנודתיות בנתונים האלה, צריך למחוק את אובייקט ה-demuxer (באמצעות קריאה ל-WebPDemuxDelete()
) ולהפעיל מחדש את WebPDemuxPartial()
בנתונים החדשים. בדרך כלל זו פעולה לא יקרה.
WebPDemuxDelete()
מפנה זיכרון שמשויך ל-dmux.
void WebPDemuxDelete(WebPDemuxer* dmux);
חילוץ נתונים/מידע
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()
מקבלים את הערך של feature מ-dmux.
uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature);
הערה: הערכים תקפים רק אם נעשה שימוש ב-WebPDemux()
או אם ב-WebPDemuxPartial()
הוחזר מצב >
WEBP_DEMUX_PARSING_HEADER
.
איטרציה של מסגרת
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()
אחזור של מסגרת frame_number מ-dmux.
int WebPDemuxGetFrame(const WebPDemuxer* dmux,
int frame_number,
WebPIterator* iter);
iter->fragment מפנה למקטע הראשון בהחזרה מהפונקציה הזו.
אפשר לחלץ מקטעים ספציפיים באמצעות WebPDemuxSelectFragment()
. הגדרה של frame_number שווה ל-0 תחזיר את המסגרת האחרונה של התמונה.
הפונקציה מחזירה את הערך false אם dmux הוא NULL או אם לא קיימת מסגרת frame_number.
בסיום השימוש באיטרטור, צריך להפעיל את WebPDemuxReleaseIterator()
.
הערה: הפרמטר dmux חייב להישאר בכל משך החיים של iter.
WebPDemuxNextFrame()
, WebPDemuxPrevFrame()
הפונקציה מגדירה את iter->fragment כך שיפנה למסגרת הבאה (iter->frame_num + 1) או הקודם (iter->frame_num - 1). הפונקציות האלה לא פועלות בלולאה.
int WebPDemuxNextFrame(WebPIterator* iter);
int WebPDemuxPrevFrame(WebPIterator* iter);
הפונקציה מחזירה את הערך 'TRUE' על הצלחה, או 'FALSE' אם לא.
WebPDemuxSelectFragment()
iter->fragment מוגדר כך שישקף את מספר המקטע fragment_num.
int WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);
הפונקציה מחזירה את הערך True אם המקטע fragment_num קיים. אחרת, היא מחזירה את הערך false.
WebPDemuxReleaseIterator()
הפעולה הזו משחררת כל זיכרון שמשויך ל-iter.
void WebPDemuxReleaseIterator(WebPIterator* iter);
הפונקציה חייבת להפעיל אותה לפני כל הקריאות הבאות אל WebPDemuxGetChunk()
באותו איטרציה. צריך לקרוא לה גם לפני שמשמידים את WebPDemuxer
המשויך אל WebPDemuxDelete()
.
איטרציה של גוש
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()
מאחזרת את המופע של chunk_number של המקטע עם המזהה fourcc מ-dmux.
int WebPDemuxGetChunk(const WebPDemuxer* dmux,
const char fourcc[4], int chunk_number,
WebPChunkIterator* iter);
fourcc הוא מערך תווים שמכיל את ה-4cc של הקטע שצריך להחזיר, למשל "ICCP", "XMP", "EXIF" וכו'.
הגדרה של chunk_number שווה ל-0 תחזיר את המקטע האחרון בקבוצה.
הפונקציה מחזירה את הערך True אם המקטע נמצא, ו-FALSE אם לא. אפשר לגשת למטענים ייעודיים (payloads) שקשורים לתמונות באמצעות WebPDemuxGetFrame()
ופונקציות קשורות. בסיום השימוש באיטרטור, צריך להפעיל את WebPDemuxReleaseChunkIterator()
.
הערה: dmux חייב להישאר לאורך כל משך החיים של האיטרטור.
WebPDemuxNextChunk()
, WebPDemuxPrevChunk()
הפונקציה iter->chunk מפנה לקבוצת הנתונים הבאה (iter->chunk_num + 1) או אל קבוצת הנתונים הקודמת (iter->chunk_num - 1). הפונקציות האלה לא פועלות בלולאה.
int WebPDemuxNextChunk(WebPChunkIterator* iter);
int WebPDemuxPrevChunk(WebPChunkIterator* iter);
הפונקציה מחזירה את הערך 'TRUE' על הצלחה, או 'FALSE' אם לא.
WebPDemuxReleaseChunkIterator()
הפעולה הזו משחררת כל זיכרון שמשויך ל-iter.
void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);
צריך להפעיל אותה לפני המשמידים את WebPDemuxer
המשויך אל WebPDemuxDelete()
.
ממשק API של WebPAnimDecoder
ממשק API זה מאפשר פענוח (אולי) של תמונות WebP מונפשות.
דוגמה לקוד
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.
אפשרויות גלובליות
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()
תמיד צריך להפעיל אותה, כדי לאתחל מבנה WebPAnimDecoderOptions חדש לפני השינוי. הפונקציה מחזירה את הערך False במקרה של חוסר התאמה בין גרסאות. חובה להשתמש ב-WebPAnimDecoderOptionsInit() לפני השימוש באובייקט dec_options.
פרמטרים
dec_options -- אפשרויות (in/out) המשמשות לפענוח אנימציה
- החזרות
- ההצלחה מובטחת
int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options);
WebPAnimDecoderNew()
יצירה והפעלה של אובייקט WebPAnimDecoder.
- פרמטרים
webp_data -- (ב) Bitstream מסוג WebP. אין לשנות את הערך הזה במהלך משך החיים של אובייקט הפלט WebPAnimDecoder.
dec_options -- (ב) אפשרויות פענוח. אפשר להעביר את הערך NULL כדי לבחור ערכי ברירת מחדל סבירים (באופן ספציפי, נבחר מצב הצבע Mode_RGBA).
- החזרות
הפניה לאובייקט WebPAnimDecoder החדש שנוצר, או ל-NULL במקרה של שגיאת ניתוח, אפשרות לא חוקית או שגיאת זיכרון.
WebPAnimDecoder* WebPAnimDecoderNew(
const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options);
מידע גלובלי על האנימציה.
struct WebPAnimInfo {
uint32_t canvas_width;
uint32_t canvas_height;
uint32_t loop_count;
uint32_t bgcolor;
uint32_t frame_count;
};
WebPAnimDecoderGetInfo()
קבלת מידע כללי על האנימציה.
- פרמטרים
dec – (במופע של מפענח) שממנו רוצים לקבל מידע.
info – מידע גלובלי שאוחזר מהאנימציה.
- החזרות
כל הכבוד על ההצלחה.
int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
WebPAnimInfo* info);
WebPAnimDecoderGetNext()
מאחזרים את הפריים הבא מ-dec על סמך האפשרויות שסופקו ל-WebPAnimDecoderNew()
. מדובר על קנבס בגודל canvas_width * 4 * canvas_height
משוחזר במלואו, ולא רק במלבן המשנה של המסגרת. הערך של מאגר הנתונים הזמני שהוחזר תקף רק עד לשיחה הבאה אל WebPAnimDecoderGetNext()
, אל WebPAnimDecoderReset()
או אל WebPAnimDecoderDelete()
.
- פרמטרים
dec -- מופע מפענח (in/out) שממנו יש לאחזר את הפריים הבא.
buf -- מסגרת מפוענחת (מחוץ).
timestamp -- חותמת הזמן (out) של המסגרת באלפיות השנייה.
- החזרות
False אם אחד מהארגומנטים הוא NULL, אם יש שגיאת ניתוח או פענוח, או אם אין פריימים נוספים. אחרת, הפונקציה מחזירה את הערך True.
int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
uint8_t** buf, int* timestamp);
WebPAnimDecoderHasMoreFrames()
בדקו אם נשארו עוד פריימים לפענוח.
- פרמטרים
- דצ -- (ב) מופע של מפענח שצריך לבדוק.
- החזרות
- True אם dec הוא לא NULL וחלק מהפריימים עדיין לא מפוענחו. אחרת, הפונקציה מחזירה את הערך false.
int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
WebPAnimDecoderReset()
מאפס את האובייקט WebPAnimDecoder, כך שהקריאה הבאה אל WebPAnimDecoderGetNext()
תתחיל מחדש את הפענוח מהפריים הראשון. זה יעזור אם צריך לפענח את כל הפריימים כמה פעמים (למשל info.loop_count פעמים) בלי להרוס וליצור מחדש את אובייקט dec.
- פרמטרים
- dec -- מופע מפענח (in/out) שצריך לאפס
void WebPAnimDecoderReset(WebPAnimDecoder* dec);
WebPAnimDecoderGetDemuxer()
אחוז באובייקט ה-Demuxer הפנימי.
קבלת אובייקט ה-demuxer יכולה להיות שימושית אם רוצים להשתמש בפעולות שזמינות רק דרך demuxer, למשל כדי לקבל מטא-נתונים של XMP/EXIF/ICC. אובייקט ה-demuxer שמוחזר נמצא בבעלות dec, ותקף רק עד הקריאה הבאה אל WebPAnimDecoderDelete()
.
- פרמטרים
- dec -- (ב) מופע מפענח שממנו יש להביא את אובייקט ה-demuxer.
const WebPDemuxer* WebPAnimDecoderGetDemuxer(const WebPAnimDecoder* dec);
WebPAnimDecoderDelete()
מוחק את האובייקט WebPAnimDecoder.
- פרמטרים
- דצ -- מופע המפענח (בתוך/מחוץ) יימחק.
- החזרות
- ההצלחה מובטחת.
void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
סוגי נתונים נפוצים
טיפוסים בני מנייה (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()
מאתחל את התוכן של האובייקט webp_data עם ערכי ברירת מחדל.
void WebPDataInit(WebPData* webp_data);
WebPDataClear()
ניקוי התוכן של האובייקט webp_data על ידי קריאה ל-free()
. לא
מקצה את האובייקט עצמו.
void WebPDataClear(WebPData* webp_data);
WebPDataCopy()
מאתר את נפח האחסון הנדרש ל-dst ומעתיק את התוכן של src. הפונקציה מחזירה את הערך נכון על הצלחה.
int WebPDataCopy(const WebPData* src, WebPData* dst);