การจัดการคอนเทนเนอร์ 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
Enum
// 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 บิตสำหรับการแก้ไขหลัก/ย่อย/การแก้ไขแต่ละรายการ เช่น v2.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 -- (ใน) ข้อมูลบิตสตรีมในรูปแบบ WebP RIFF
copy_data -- ค่า (in) 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 -- (เข้า/ออก) ที่จะเพิ่มกลุ่ม
fourcc -- (in) อาร์เรย์อักขระที่มี 4cc ของค่าที่กำหนด chunk; เช่น "ICCP", "XMP", "EXIF" อื่นๆ
chunk_data -- (ใน) ข้อมูลกลุ่มที่จะเพิ่ม
copy_data -- ค่า (in) 1 ระบุว่าระบบจะคัดลอกข้อมูลที่ให้มาไปยัง Mux และค่า 0 บ่งชี้ว่าระบบจะไม่คัดลอกข้อมูลไปยังออบเจ็กต์ mux
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก mux, 4cc หรือ chunk_data เป็นค่า NULL หรือหาก 4cc สอดคล้องกับกลุ่มรูปภาพWEBP_MUX_MEMORY_ERROR
-- เมื่อเกิดข้อผิดพลาดในการจัดสรรหน่วยความจำWEBP_MUX_OK
-- สำเร็จแล้ว
WebPMuxGetChunk()
รับการอ้างอิงข้อมูลของกลุ่มที่มีรหัส fourcc ในออบเจ็กต์ Mux ผู้โทรไม่ควรทำให้ข้อมูลที่ส่งคืนมาว่างได้
WebPMuxError WebPMuxGetChunk(const WebPMux* mux,
const char fourcc[4],
WebPData* chunk_data);
- พารามิเตอร์
mux -- (in) ออบเจ็กต์ข้อมูลกลุ่มที่จะดึงข้อมูล
fourcc -- (in) อาร์เรย์อักขระที่มี 4cc ของกลุ่ม เช่น "ICCP", "XMP", "EXIF" อื่นๆ
chunk_data -- (ออก) แสดงผลข้อมูลกลุ่ม
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก mux, 4cc หรือ chunk_data เป็นค่า NULL หรือหาก 4cc สอดคล้องกับกลุ่มรูปภาพWEBP_MUX_NOT_FOUND
-- หาก Mux ไม่มีกลุ่มที่มี รหัสWEBP_MUX_OK
-- สำเร็จแล้ว
WebPMuxDeleteChunk()
ลบกลุ่มที่มี fourcc ที่ระบุออกจากออบเจ็กต์ Mux
WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]);
- พารามิเตอร์
mux -- (เข้า/ออก) ที่จะลบกลุ่มข้อมูล
fourcc -- (in) อาร์เรย์อักขระที่มี 4cc ของกลุ่ม เช่น "ICCP", "XMP", "EXIF" อื่นๆ
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก mux หรือ 4cc เป็นค่า NULL หรือ 4cc จะสอดคล้องกับกลุ่มรูปภาพWEBP_MUX_NOT_FOUND
-- หาก Mux ไม่มีกลุ่มที่มี 4ccWEBP_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 -- (เข้า/ออก) ที่จะตั้งค่ารูปภาพ
bitstream -- (in) อาจเป็น VP8/VP8L บิตสตรีมดิบหรือ WebP แบบภาพเดียว ไฟล์ (ไม่เคลื่อนไหวและไม่แยกส่วน)
copy_data -- ค่า (in) 1 ระบุว่าระบบจะคัดลอกข้อมูลที่ให้มาไปยัง Mux และค่า 0 บ่งชี้ว่าระบบจะไม่คัดลอกข้อมูลไปยังออบเจ็กต์ mux
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก Mux เป็น NULL หรือบิตสตรีมเป็น NULLWEBP_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 -- ค่า (in) 1 ระบุว่าระบบจะคัดลอกข้อมูลที่ให้มาไปยัง Mux และค่า 0 บ่งชี้ว่าระบบจะไม่คัดลอกข้อมูลไปยังออบเจ็กต์ mux
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก Mux หรือเฟรมเป็น NULL หรือเนื้อหาของ frame ไม่ถูกต้องWEBP_MUX_MEMORY_ERROR
-- เมื่อเกิดข้อผิดพลาดในการจัดสรรหน่วยความจำWEBP_MUX_OK
-- สำเร็จแล้วWEBP_MUX_MEMORY_ERROR
-- เมื่อเกิดข้อผิดพลาดในการจัดสรรหน่วยความจำ
WebPMuxGetFrame()
รับเฟรมที่ n จากวัตถุ Mux เนื้อหาของ frame->bitstream คือ
ที่จัดสรรโดยใช้ Malloc() และไม่ได้เป็นเจ้าของโดยออบเจ็กต์ mux ต้องเป็น
ซึ่งผู้โทรจะดีลนั้นโดยโทรไปที่ WebPDataClear()
nth=0
มีความหมายพิเศษ นั่นคือ ตำแหน่งสุดท้าย
WebPMuxError WebPMuxGetFrame(const WebPMux* mux,
uint32_t nth,
WebPMuxFrameInfo* frame);
- พารามิเตอร์
mux -- (in) ออบเจ็กต์ที่จะดึงข้อมูล
nth -- (ใน) ดัชนีเฟรมในออบเจ็กต์ Mux
frame -- (ออก) ของเฟรมที่แสดงผล
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- if mux or frame is 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 -- (in) ตำแหน่งที่เฟรมจะถูกลบ
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- if mux is NULL.WEBP_MUX_NOT_FOUND
-- หากมีเฟรมน้อยกว่า n ใน Mux ก่อนลบWEBP_MUX_OK
-- สำเร็จแล้ว
แอนิเมชัน
พารามิเตอร์ของภาพเคลื่อนไหว
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 -- (เข้า/ออก) ที่ต้องตั้งค่า/เพิ่มส่วน ANIM
params -- (in) พารามิเตอร์ภาพเคลื่อนไหว
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก mux หรือพารามิเตอร์เป็นค่า NULLWEBP_MUX_MEMORY_ERROR
-- เมื่อเกิดข้อผิดพลาดในการจัดสรรหน่วยความจำWEBP_MUX_OK
-- สำเร็จแล้ว
WebPMuxGetAnimationParams()
รับพารามิเตอร์ภาพเคลื่อนไหวจากออบเจ็กต์ Mux
WebPMuxError WebPMuxGetAnimationParams(const WebPMux* mux,
WebPMuxAnimParams* params);
- พารามิเตอร์
mux -- ออบเจ็กต์ (in) ที่เป็นพารามิเตอร์ของภาพเคลื่อนไหวที่จะดึงข้อมูล
params -- (ออก) พารามิเตอร์ภาพเคลื่อนไหวที่ดึงมาจากกลุ่ม ANIM
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- หาก mux หรือพารามิเตอร์เป็นค่า NULLWEBP_MUX_NOT_FOUND
-- หากไม่มีส่วน ANIM ในออบเจ็กต์ MuxWEBP_MUX_OK
-- สำเร็จแล้ว
เบ็ดเตล็ด สาธารณูปโภค
WebPMuxGetCanvasSize()
รับขนาด Canvas จากออบเจ็กต์ Mux
WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
int* width,
int* height);
หมายเหตุ: วิธีนี้จะถือว่ากลุ่ม VP8X (หากมี) เป็นปัจจุบัน
กล่าวคือ ออบเจ็กต์ Mux ไม่มีการแก้ไขตั้งแต่การเรียกครั้งล่าสุดไปยัง
WebPMuxAssemble()
หรือ WebPMuxCreate()
- พารามิเตอร์
mux -- ออบเจ็กต์ (in) ที่จะดึงข้อมูลขนาด Canvas
width -- (ออก) ความกว้างของผ้าใบ
height - (ออก) ความสูงของแคนวาส
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- if mux, width or height is NULL.WEBP_MUX_BAD_DATA
-- หากขนาด VP8X/VP8/VP8L หรือ Canvas ไม่ถูกต้องWEBP_MUX_OK
-- สำเร็จแล้ว
WebPMuxGetFeatures()
รับแฟล็กฟีเจอร์จากออบเจ็กต์ Mux
WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags);
หมายเหตุ: วิธีนี้จะถือว่ากลุ่ม VP8X (หากมี) เป็นปัจจุบัน
กล่าวคือ ออบเจ็กต์ Mux ไม่มีการแก้ไขตั้งแต่การเรียกครั้งล่าสุดไปยัง
WebPMuxAssemble()
หรือ WebPMuxCreate()
- พารามิเตอร์
mux -- (in) ออบเจ็กต์ที่จะดึงข้อมูลจุดสนใจ
flags -- (ออก) แฟล็กที่ระบุว่ามีฟีเจอร์ใดอยู่ใน Mux ออบเจ็กต์ ตัวแปรนี้จะเป็น "OR" ของค่าแฟล็กต่างๆ แจกแจง
WebPFeatureFlags
ใช้เพื่อทดสอบค่าแฟล็กแต่ละค่าได้- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- if mux or flags is NULL.WEBP_MUX_BAD_DATA
-- หากขนาด VP8X/VP8/VP8L หรือ Canvas ไม่ถูกต้องWEBP_MUX_OK
-- สำเร็จแล้ว
WebPMuxNumChunks()
รับจำนวนกลุ่มที่มีค่าแท็กที่ระบุในออบเจ็กต์ mux
WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
WebPChunkId id,
int* num_elements);
- พารามิเตอร์
mux -- (in) ออบเจ็กต์ที่จะดึงข้อมูล
id -- (in) รหัสกลุ่มที่ระบุประเภทของกลุ่ม
num_elements -- จำนวนกลุ่มที่มีรหัสกลุ่มที่ระบุ (ออก)
- การคืนสินค้า
WEBP_MUX_INVALID_ARGUMENT
-- if mux, or num_elements is NULL.WEBP_MUX_OK
-- สำเร็จแล้ว
WebPMuxAssemble()
ประกอบกลุ่มทั้งหมดในรูปแบบ WebP RIFF แล้วแสดงผลใน assembled_data ฟังก์ชันนี้จะตรวจสอบออบเจ็กต์ Mux ด้วย
WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data);
หมายเหตุ: ระบบจะละเว้นและเขียนทับเนื้อหาของ asCompositd_data
นอกจากนี้ ระบบจะจัดสรรเนื้อหาของ assembled_data โดยใช้ Malloc() และไม่ใช่
ที่เป็นของออบเจ็กต์ mux ผู้โทรจะต้องจัดการให้โดยการโทร
WebPDataClear()
- พารามิเตอร์
mux -- (เข้า/ออก) ที่จะนำชิ้นส่วนที่จะประกอบเข้าด้วยกัน
assembled_data -- (เอาออก) ข้อมูล WebP ที่ประกอบเข้าด้วยกัน
- การคืนสินค้า
WEBP_MUX_BAD_DATA
-- หากออบเจ็กต์ Mux ไม่ถูกต้องWEBP_MUX_INVALID_ARGUMENT
-- if mux or assembled_data is 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 ใหม่ ก่อนแก้ไข แสดงผลเท็จในกรณีที่เวอร์ชันไม่ตรงกัน WebPAnimEncoderOptionsInit() ต้องสำเร็จก่อนที่จะใช้ enc_options
- พารามิเตอร์
- enc_options -- ตัวเลือก (เข้า/ออก) ที่ใช้สำหรับการเข้ารหัสภาพเคลื่อนไหว
- การคืนสินค้า
- จริงอยู่ที่ความสำเร็จ
int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderNew()
สร้างและเริ่มต้นออบเจ็กต์ WebPAnimEncoder
- พารามิเตอร์
width/height -- (in) ความกว้างและความสูงของ Canvas ของภาพเคลื่อนไหว
enc_options -- (in) ตัวเลือกการเข้ารหัส สามารถส่งผ่าน NULL เพื่อเลือก เริ่มต้นที่สมเหตุสมผล
- การคืนสินค้า
ตัวชี้ไปยังออบเจ็กต์ WebPAnimEncoder ที่สร้างใหม่ หรือ NULL ในกรณีที่ หน่วยความจํา
WebPAnimEncoder* WebPAnimEncoderNew(
int width, int height, const WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderAdd()
เพิ่มประสิทธิภาพเฟรมที่ระบุสำหรับ WebP โดยเข้ารหัสและเพิ่มลงใน ออบเจ็กต์ WebPAnimEncoder
การเรียก WebPAnimEncoderAdd ครั้งล่าสุดควรดำเนินการด้วย frame = NULL
ซึ่ง
บ่งบอกว่าไม่ต้องเพิ่มเฟรมอีก การโทรนี้ยังใช้เพื่อ
กำหนดระยะเวลาของเฟรมสุดท้าย
- พารามิเตอร์
enc -- (เข้า/ออก) ที่จะเพิ่มเฟรมลงไป
frame -- (เข้า/ออก) ข้อมูลเฟรมในรูปแบบ ARGB หรือ YUV(A) หากอยู่ใน รูปแบบ YUV(A) จะถูกแปลงเป็น ARGB ซึ่งทำให้เกิดการสูญเสียเล็กน้อย
timestamp_ms -- (in) การประทับเวลาของเฟรมนี้ในหน่วยมิลลิวินาที ระยะเวลา ของเฟรมจะคำนวณเป็น "การประทับเวลาของเฟรมถัดไป - การประทับเวลาของ เฟรมนี้" ดังนั้น การประทับเวลาควรเรียงตามลำดับที่ไม่ลดลง
config -- (ใน) ตัวเลือกการเข้ารหัส สามารถส่งผ่าน NULL เพื่อเลือก ค่าเริ่มต้น
- การคืนสินค้า
หากเกิดข้อผิดพลาด จะแสดงผลเป็น "เท็จ" และตั้งค่า
frame->error_code
อย่างเหมาะสม หากไม่ใช่ จะแสดงค่า "จริง"
int WebPAnimEncoderAdd(
WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
const struct WebPConfig* config);
WebPAnimEncoderAssemble()
ประกอบเฟรมทั้งหมดที่เพิ่มมาจนถึงบิตสตรีม WebP การโทรนี้ควรเป็น
อยู่หลังการเรียกไปยัง WebPAnimEncoderAdd ด้วย frame = NULL
หากไม่
ระบบจะประมาณระยะเวลาของเฟรมสุดท้ายเป็นการภายใน
- พารามิเตอร์
enc -- (เข้า/ออก) ที่ใช้ประกอบเฟรม
webp_data -- (ออก) สร้างบิตสตรีมของ WebP
- การคืนสินค้า
ความสำเร็จที่ยิ่งใหญ่
int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data);
WebPAnimEncoderGetError()
รับสตริงข้อผิดพลาดที่เกี่ยวข้องกับการเรียกล่าสุดโดยใช้ enc
สตริงที่แสดงผลเป็นของ enc และจะใช้ได้จนกว่าจะมีการเรียก
WebPAnimEncoderAdd()
หรือ
WebPAnimEncoderAssemble()
หรือ
WebPAnimEncoderDelete()
- พารามิเตอร์
- enc -- (เข้า/ออก) จากสตริงข้อผิดพลาดที่จะดึงข้อมูล
- การคืนสินค้า
- NULL if enc is NULL. มิฉะนั้น จะแสดงผลสตริงข้อผิดพลาดถ้าค่าสุดท้าย การเรียก enc มีข้อผิดพลาด หรือสตริงว่างเปล่าถ้าการเรียกครั้งล่าสุดเป็น ประสบความสำเร็จ
const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
WebPAnimEncoderDelete()
ลบออบเจ็กต์ WebPAnimEncoder
- พารามิเตอร์
- enc -- (เข้า/ออก) ที่จะลบ
void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
API ของ Demux
เปิดใช้การดึงรูปภาพและข้อมูลรูปแบบแบบขยายจากไฟล์ 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
Enum
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 บิตสำหรับการแก้ไขหลัก/ย่อย/การแก้ไขแต่ละรายการ เช่น v2.5.7 คือ 0x020507
int WebPGetDemuxVersion(void);
WebPDemux()
แยกวิเคราะห์ไฟล์ WebP แบบเต็มที่ได้จาก data
WebPDemuxer WebPDemux(const WebPData* data);
แสดงผลออบเจ็กต์ WebPDemuxer
เมื่อแยกวิเคราะห์สำเร็จ หรือแสดงผลเป็น NULL
WebPDemuxPartial()
แยกวิเคราะห์ไฟล์ WebP ที่อาจไม่สมบูรณ์ซึ่งระบุโดย data หาก state คือ ไม่ใช่ NULL จะมีการตั้งค่าเพื่อระบุสถานะของ Demuxer
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 หรือไม่มีเฟรม dmux
โทรหา WebPDemuxReleaseIterator()
เมื่อใช้
ตัววนซ้ำเสร็จสมบูรณ์
หมายเหตุ: dmux จะต้องคงอยู่ตลอดอายุการใช้งานของ iter
WebPDemuxNextFrame()
WebPDemuxPrevFrame()
ตั้งค่า iter->fragment ให้ชี้ไปที่รายการถัดไป (iter->fragment + 1) หรือ ก่อนหน้า (iter->frame_num - 1) เฟรม โดยฟังก์ชันดังกล่าวจะไม่วนซ้ำ
int WebPDemuxNextFrame(WebPIterator* iter);
int WebPDemuxPrevFrame(WebPIterator* iter);
แสดงผลเป็น "จริง" เมื่อสำเร็จ "เท็จ" หากไม่เป็นเช่นนั้น
WebPDemuxSelectFragment()
ตั้งค่า iter->fragment เพื่อแสดงหมายเลขส่วนย่อย iter->fragment
int WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);
แสดงผลเป็น "จริง" หากมีแฟรกเมนต์ 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 จะแสดงผลกลุ่มสุดท้ายในชุด
แสดงผลเป็น "จริง" หากพบกลุ่มส่วน "เท็จ" หากไม่เป็นเช่นนั้น ส่วนที่เกี่ยวข้องกับรูปภาพ
มีการเข้าถึงเพย์โหลดผ่าน WebPDemuxGetFrame()
และฟังก์ชันที่เกี่ยวข้อง โทร
WebPDemuxReleaseChunkIterator()
เมื่อใช้งาน
ของตัวทำซ้ำเสร็จสมบูรณ์
หมายเหตุ: dmux ต้องคงอยู่ตลอดอายุของตัววนซ้ำ
WebPDemuxNextChunk()
WebPDemuxPrevChunk()
ตั้งค่าiter->กลุ่มให้ชี้ไปที่รายการถัดไป (iter->chunk_num + 1) หรือ กลุ่มก่อนหน้า (iter->chunk_num - 1) โดยฟังก์ชันดังกล่าวจะไม่วนซ้ำ
int WebPDemuxNextChunk(WebPChunkIterator* iter);
int WebPDemuxPrevChunk(WebPChunkIterator* iter);
แสดงผลเป็น "จริง" เมื่อสำเร็จ "เท็จ" หากไม่เป็นเช่นนั้น
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 ใหม่ ก่อนแก้ไข แสดงผลเท็จในกรณีที่เวอร์ชันไม่ตรงกัน WebPAnimDecoderOptionsInit() ต้องสำเร็จก่อนที่จะใช้ dec_options
พารามิเตอร์
dec_options -- ตัวเลือก (เข้า/ออก) ที่ใช้สำหรับการถอดรหัสภาพเคลื่อนไหว
- การคืนสินค้า
- จริงอยู่ที่ความสำเร็จ
int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options);
WebPAnimDecoderNew()
สร้างและเริ่มต้นออบเจ็กต์ WebPAnimDecoder
- พารามิเตอร์
webp_data -- (ใน) บิตสตรีมของ 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
ที่สร้างขึ้นใหม่ ไม่ใช่แค่
สี่เหลี่ยมผืนผ้าย่อยของเฟรม บัฟเฟอร์ที่แสดงผล buf จะใช้ได้จนถึง
การโทรครั้งถัดไปถึง WebPAnimDecoderGetNext()
WebPAnimDecoderReset()
หรือ
WebPAnimDecoderDelete()
- พารามิเตอร์
dec -- อินสแตนซ์ตัวถอดรหัส (เข้า/ออก) ที่เฟรมถัดไปจะเป็น ดึงข้อมูลแล้ว
buf -- (ออก) เฟรมที่ถอดรหัส
timestamp -- การประทับเวลา (ออก) ของเฟรมเป็นมิลลิวินาที
- การคืนสินค้า
เท็จ หากมีอาร์กิวเมนต์ใดเป็น NULL หรือหากมีการแยกวิเคราะห์ หรือ เกิดความผิดพลาดในการเข้ารหัส หรือหากไม่มีเฟรมแล้ว หากไม่ใช่ จะแสดงค่า "จริง"
int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
uint8_t** buf, int* timestamp);
WebPAnimDecoderHasMoreFrames()
ตรวจสอบว่ามีเฟรมเหลือที่จะถอดรหัสอีกหรือไม่
- พารามิเตอร์
- dec -- (ใน) อินสแตนซ์ตัวถอดรหัสที่จะตรวจสอบ
- การคืนสินค้า
- เป็นจริงหาก dec ไม่เป็น NULL และบางเฟรมยังไม่ได้ถอดรหัส หากไม่ จะแสดงค่า "เท็จ"
int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
WebPAnimDecoderReset()
รีเซ็ตออบเจ็กต์ WebPAnimDecoder เพื่อให้การเรียก
WebPAnimDecoderGetNext()
จะเริ่มถอดรหัสอีกครั้ง
ตั้งแต่เฟรมแรก การดำเนินการนี้จะเป็นประโยชน์เมื่อต้องถอดรหัสเฟรมทั้งหมด
หลายครั้ง (เช่น info.loop_count ครั้ง) โดยไม่ทำลายและสร้างใหม่
ออบเจ็กต์ dec
- พารามิเตอร์
- dec -- อินสแตนซ์ตัวถอดรหัส (เข้า/ออก) ที่จะรีเซ็ต
void WebPAnimDecoderReset(WebPAnimDecoder* dec);
WebPAnimDecoderGetDemuxer()
รับออบเจ็กต์ Demuxer ภายใน
การรับออบเจ็กต์ demuxer จะมีประโยชน์ในกรณีที่ต้องการใช้การดำเนินการเท่านั้น
พร้อมใช้งานผ่าน demuxer เช่น เพื่อรับข้อมูลเมตา XMP/EXIF/ICC ผลลัพธ์
ออบเจ็กต์ demuxer เป็นของ dec และจะใช้ได้จนถึงการเรียกใช้ครั้งถัดไป
WebPAnimDecoderDelete()
- พารามิเตอร์
- dec -- (ใน) อินสแตนซ์ตัวถอดรหัสที่จะเป็นออบเจ็กต์ demuxer ดึงข้อมูลแล้ว
const WebPDemuxer* WebPAnimDecoderGetDemuxer(const WebPAnimDecoder* dec);
WebPAnimDecoderDelete()
ลบออบเจ็กต์ WebPAnimDecoder
- พารามิเตอร์
- dec -- อินสแตนซ์ตัวถอดรหัส (เข้า/ออก) ที่จะถูกลบ
- การคืนสินค้า
- จริงอยู่ที่ความสำเร็จ
void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
ประเภทข้อมูลทั่วไป
Enum
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);