Tài liệu về API vùng chứa WebP

Thao tác với vùng chứa RIFF cho hình ảnh WebP.

API Mux

Cho phép thao tác với hình ảnh vùng chứa WebP, chứa các tính năng như hồ sơ màu sắc, siêu dữ liệu, ảnh động và hình ảnh phân mảnh.

Ví dụ về mã

Tạo MUX bằng dữ liệu hình ảnh, cấu hình màu và siêu dữ liệu 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);

Lấy dữ liệu cấu hình màu và hình ảnh từ tệp 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);

Vòng đời của đối tượng 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()

Trả về số phiên bản của thư viện mux, được đóng gói trong hệ thập lục phân bằng cách sử dụng 8 bit cho mỗi giá trị chính/phụ/bản sửa đổi. Ví dụ: phiên bản 2.5.7 là 0x020507.

int WebPGetMuxVersion(void);

WebPMuxNew()

Tạo một đối tượng mux trống.

WebPMux* WebPMuxNew(void);
Trả bóng
Một con trỏ đến đối tượng mux trống mới tạo.

WebPMuxDelete()

Xoá đối tượng mux.

void WebPMuxDelete(WebPMux* mux);
Các tham số
mux – đối tượng (vào/ra) cần xoá

Sáng tạo Mux

WebPMuxCreate()

Tạo đối tượng mux từ dữ liệu thô được cung cấp ở định dạng WebP RIFF.

WebPMux* WebPMuxCreate(const WebPData* bitstream, int copy_data);
Các tham số

bitstream – (trong) dữ liệu luồng bit ở định dạng WebP RIFF

copy_data – (trong) giá trị 1 cho biết dữ liệu đã cho SẼ được sao chép sang mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép sang đối tượng mux.

Trả bóng

Một con trỏ đến đối tượng kết hợp được tạo từ dữ liệu đã cho – khi thành công.

NULL – Trong trường hợp lỗi dữ liệu hoặc bộ nhớ không hợp lệ.

Phân đoạn không phải hình ảnh

WebPMuxSetChunk()

Thêm một đoạn có mã fourcc và dữ liệu chunk_data vào đối tượng mux. Mọi phân đoạn hiện có có cùng mã nhận dạng sẽ bị xoá.

WebPMuxError WebPMuxSetChunk(WebPMux* mux,
                             const char fourcc[4],
                             const WebPData* chunk_data,
                             int copy_data);

Lưu ý: Bạn chỉ nên quản lý các phân đoạn không liên quan đến hình ảnh thông qua API phân đoạn. (Các đoạn liên quan đến hình ảnh là: "ANMF", "FRGM", "VP8 ", "VP8L" và "ALPH"). Để thêm, lấy và xoá hình ảnh, hãy sử dụng WebPMuxSetImage(), WebPMuxPushFrame(), WebPMuxGetFrame()WebPMuxDeleteFrame().

Các tham số

mux – (vào/ra) đối tượng mà phân đoạn sẽ được thêm vào

fourcc – (trong) một mảng ký tự chứa 4cc của phân đoạn đã cho; ví dụ: "ICCP", "XMP ", "EXIF", v.v.

chunk_data – (trong) dữ liệu phân đoạn sẽ được thêm vào

copy_data – (trong) giá trị 1 cho biết dữ liệu đã cho SẼ được sao chép sang mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép sang đối tượng mux.

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux, 4cc hoặc chunk_data là NULL (Rỗng) hoặc nếufourcc tương ứng với một phân đoạn hình ảnh.

WEBP_MUX_MEMORY_ERROR – do lỗi phân bổ bộ nhớ.

WEBP_MUX_OK – khi thành công.

WebPMuxGetChunk()

Lấy thông tin tham chiếu đến dữ liệu của phân đoạn có mã fourcc trong đối tượng mux. Phương thức gọi KHÔNG được giải phóng dữ liệu được trả về.

WebPMuxError WebPMuxGetChunk(const WebPMux* mux,
                             const char fourcc[4],
                             WebPData* chunk_data);
Các tham số

mux – đối tượng (trong) mà từ đó dữ liệu phân đoạn sẽ được tìm nạp

fourcc – (trong) một mảng ký tự chứa 4cc của phân đoạn; ví dụ: "ICCP", "XMP ", "EXIF", v.v.

chunk_data – (out) trả về dữ liệu phân đoạn

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux, 4cc hoặc chunk_data là NULL (Rỗng) hoặc nếufourcc tương ứng với một phân đoạn hình ảnh.

WEBP_MUX_NOT_FOUND – Nếu mux không chứa một đoạn có mã nhận dạng đã cho.

WEBP_MUX_OK – khi thành công.

WebPMuxDeleteChunk()

Xoá phân đoạn có fourcc đã cho khỏi đối tượng mux.

WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]);
Các tham số

mux – (vào/ra) đối tượng mà phân đoạn sẽ bị xoá

fourcc – (trong) một mảng ký tự chứa 4cc của phân đoạn; ví dụ: "ICCP", "XMP ", "EXIF", v.v.

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux hoặc Fourcc là NULL hoặc nếu 4cc tương ứng với một phân đoạn hình ảnh.

WEBP_MUX_NOT_FOUND – Nếu mux không chứa một đoạn có 4cc đã cho.

WEBP_MUX_OK – khi thành công.

Hình ảnh

Đóng gói dữ liệu về một khung/mảnh.

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()

Đặt hình ảnh (không động và không phân mảnh) trong đối tượng mux. Lưu ý: Mọi hình ảnh hiện có (bao gồm cả khung/mảnh) sẽ bị xoá.

WebPMuxError WebPMuxSetImage(WebPMux* mux,
                             const WebPData* bitstream,
                             int copy_data);
Các tham số

mux -- (vào/ra) đối tượng mà trong đó hình ảnh sẽ được đặt

bitstream – (trong) có thể là luồng bit VP8/VP8L thô hoặc tệp WebP đơn hình ảnh (không động và không phân mảnh)

copy_data – (trong) giá trị 1 cho biết dữ liệu đã cho SẼ được sao chép sang mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép sang đối tượng mux.

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux là NULL hoặc luồng bit là NULL.

WEBP_MUX_MEMORY_ERROR – do lỗi phân bổ bộ nhớ.

WEBP_MUX_OK – khi thành công.

WebPMuxPushFrame()

Thêm một khung ở cuối đối tượng kết hợp.

WebPMuxError WebPMuxPushFrame(WebPMux* mux,
                              const WebPMuxFrameInfo* frame,
                              int copy_data);

Lưu ý:

  1. frame.id phải là một trong hai giá trị WEBP_CHUNK_ANMF hoặc WEBP_CHUNK_FRGM
  2. Để đặt hình ảnh tĩnh không phân mảnh, hãy dùng WebPMuxSetImage().
  3. Loại khung được đẩy phải giống với loại khung trong mux.
  4. Vì WebP chỉ hỗ trợ độ lệch chẵn, nên mọi mức chênh lệch lẻ sẽ được điều chỉnh thành một vị trí đồng đều bằng cách sử dụng: offset &= ~1
Các tham số

mux – (vào/ra) đối tượng mà khung sẽ được thêm vào

khung – dữ liệu (trong) khung.

copy_data – (trong) giá trị 1 cho biết dữ liệu đã cho SẼ được sao chép sang mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép sang đối tượng mux.

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux hoặc khung là NULL hoặc nếu nội dung của khung không hợp lệ.

WEBP_MUX_MEMORY_ERROR – do lỗi phân bổ bộ nhớ.

WEBP_MUX_OK – khi thành công.

WEBP_MUX_MEMORY_ERROR – do lỗi phân bổ bộ nhớ.

WebPMuxGetFrame()

Lấy khung thứ n từ đối tượng mux. Nội dung của frame->bitstream được phân bổ bằng Malloc() và KHÔNG thuộc sở hữu của đối tượng mux. Ứng dụng PHẢI được phương thức gọi giải quyết bằng cách gọi WebPDataClear(). nth=0 có ý nghĩa đặc biệt – vị trí cuối cùng.

WebPMuxError WebPMuxGetFrame(const WebPMux* mux,
                             uint32_t nth,
                             WebPMuxFrameInfo* frame);
Các tham số

mux – đối tượng (in) mà thông tin sẽ được tìm nạp từ đó

nth – chỉ mục (in) của khung trong đối tượng mux

frame – dữ liệu (ngoài) của khung được trả về

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu giá trị mux hoặc khung là NULL.

WEBP_MUX_NOT_FOUND – nếu có ít hơn khung hình thứ n trong đối tượng mux.

WEBP_MUX_BAD_DATA – nếu phần khung thứ n trong mux không hợp lệ.

WEBP_MUX_OK – khi thành công.

WebPMuxDeleteFrame()

Xoá một khung khỏi đối tượng mux. nth=0 có ý nghĩa đặc biệt – vị trí cuối cùng.

WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
Các tham số

mux -- (vào/ra) đối tượng mà khung sẽ bị xoá

nth – (ở) Vị trí mà từ đó khung sẽ bị xoá

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux là NULL.

WEBP_MUX_NOT_FOUND – Nếu có ít khung hình thứ n trong đối tượng mux trước khi xoá.

WEBP_MUX_OK – khi thành công.

Hoạt ảnh

Tham số ảnh động

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()

Đặt tham số ảnh động trong đối tượng mux. Mọi phân đoạn ANIM hiện có sẽ bị xoá.

WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
                                       const WebPMuxAnimParams* params);
Các tham số

mux -- (vào/ra) đối tượng mà phân đoạn ANIM sẽ được đặt/thêm

params – tham số ảnh động (in).

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux hoặc tham số là NULL.

WEBP_MUX_MEMORY_ERROR – do lỗi phân bổ bộ nhớ.

WEBP_MUX_OK – khi thành công.

WebPMuxGetAnimationParams()

Lấy tham số ảnh động từ đối tượng mux.

WebPMuxError WebPMuxGetAnimationParams(const WebPMux* mux,
                                       WebPMuxAnimParams* params);
Các tham số

mux -- (trong) đối tượng mà từ đó tham số ảnh động được tìm nạp

params – (out) thông số ảnh động được trích xuất từ đoạn ANIM

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux hoặc tham số là NULL.

WEBP_MUX_NOT_FOUND – nếu không có phân đoạn ANIM trong đối tượng kết hợp.

WEBP_MUX_OK – khi thành công.

Tiện ích khác

WebPMuxGetCanvasSize()

Lấy kích thước canvas từ đối tượng mux.

WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
                                  int* width,
                                  int* height);

Lưu ý: Phương pháp này giả định rằng phân đoạn VP8X (nếu có) đã được cập nhật. Điều đó có nghĩa là đối tượng mux chưa được sửa đổi kể từ lần gọi gần đây nhất đến WebPMuxAssemble() hoặc WebPMuxCreate().

Các tham số

mux – đối tượng (in) mà từ đó kích thước canvas sẽ được tìm nạp

width (chiều rộng) – chiều rộng (out) canvas

height (chiều cao) – (ngoài) canvas chiều cao

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu giá trị mux, chiều rộng hoặc chiều cao là NULL.

WEBP_MUX_BAD_DATA – nếu kích thước phân đoạn hoặc canvas VP8X/VP8/VP8L không hợp lệ.

WEBP_MUX_OK – khi thành công.

WebPMuxGetFeatures()

Lấy cờ tính năng từ đối tượng mux.

WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags);

Lưu ý: Phương pháp này giả định rằng phân đoạn VP8X (nếu có) đã được cập nhật. Điều đó có nghĩa là đối tượng mux chưa được sửa đổi kể từ lần gọi gần đây nhất đến WebPMuxAssemble() hoặc WebPMuxCreate().

Các tham số

mux -- (in) đối tượng mà từ đó các tính năng sẽ được tìm nạp

flags – (ra) các cờ chỉ định những tính năng có trong đối tượng mux. Đây sẽ là giá trị OR của nhiều giá trị cờ. Bạn có thể sử dụng enum WebPFeatureFlags để kiểm thử từng giá trị cờ.

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mục kết hợp hoặc cờ là NULL.

WEBP_MUX_BAD_DATA – nếu kích thước phân đoạn hoặc canvas VP8X/VP8/VP8L không hợp lệ.

WEBP_MUX_OK – khi thành công.

WebPMuxNumChunks()

Lấy số đoạn có giá trị thẻ đã cho trong đối tượng mux.

WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
                              WebPChunkId id,
                              int* num_elements);
Các tham số

mux – đối tượng (in) mà thông tin sẽ được tìm nạp từ đó

id -- id phân đoạn (trong) chỉ định loại phân đoạn

num_elements - số lượng phân đoạn có id phân đoạn đã cho

Trả bóng

WEBP_MUX_INVALID_ARGUMENT – nếu mux hoặc num_element là NULL.

WEBP_MUX_OK – khi thành công.

WebPMuxAssemble()

Tập hợp tất cả các phân đoạn ở định dạng WebP RIFF và trả về ở assembled_data. Hàm này cũng xác thực đối tượng mux.

WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data);

Lưu ý: Nội dung của assembled_data sẽ bị bỏ qua và ghi đè. Ngoài ra, nội dung của assembled_data được phân bổ bằng Malloc() và KHÔNG thuộc sở hữu của đối tượng mux. Nó PHẢI được giải phóng bởi phương thức gọi bằng cách gọi WebPDataClear().

Các tham số

mux – (vào/ra) đối tượng có các đoạn cần được tập hợp

assembled_data – dữ liệu WebP được tập hợp (out)

Trả bóng

WEBP_MUX_BAD_DATA – nếu đối tượng mux không hợp lệ.

WEBP_MUX_INVALID_ARGUMENT – nếu mux hoặc matching_data là NULL.

WEBP_MUX_MEMORY_ERROR – do lỗi phân bổ bộ nhớ.

WEBP_MUX_OK – khi thành công.

API WebPAnimEncoder

API này cho phép mã hoá (có thể) hình ảnh WebP động.

Ví dụ về mã

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.

Tuỳ chọn chung

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()

Phải luôn được gọi để khởi chạy cấu trúc WebPAnimEncoderOptions mới trước khi sửa đổi. Trả về false trong trường hợp phiên bản không khớp. WebPAnimEncoderOptionsInit() phải thành công trước khi sử dụng đối tượng enc_options.

Các tham số
enc_options – (in/out) dùng để mã hoá ảnh động
Trả bóng
Đúng về thành công.
int WebPAnimEncoderOptionsInit(
    WebPAnimEncoderOptions* enc_options);

WebPAnimEncoderNew()

Tạo và khởi chạy đối tượng WebPAnimEncoder.

Các tham số

width/height -- (in) chiều rộng và chiều cao canvas của ảnh động.

enc_options – (in) tuỳ chọn mã hoá; có thể được chuyển giá trị NULL để chọn các giá trị mặc định hợp lý.

Trả bóng

Con trỏ tới đối tượng WebPAnimEncoder mới tạo hoặc NULL trong trường hợp có lỗi bộ nhớ.

WebPAnimEncoder* WebPAnimEncoderNew(
    int width, int height, const WebPAnimEncoderOptions* enc_options);

WebPAnimEncoderAdd()

Tối ưu hoá khung nhất định cho WebP, mã hoá và thêm khung đó vào đối tượng WebPAnimEncoder.

Lệnh gọi cuối cùng đến WebPAnimEncoderAdd phải bằng frame = NULL, cho biết không cần thêm khung hình nào nữa. Lệnh gọi này cũng dùng để xác định thời lượng của khung hình cuối cùng.

Các tham số

enc – (vào/ra) đối tượng mà khung sẽ được thêm vào.

khung – dữ liệu khung hình (vào/ra) ở định dạng ARGB hoặc YUV(A). Nếu ở định dạng YUV(A), tệp sẽ được chuyển đổi sang ARGB, gây ra một khoản tổn thất nhỏ.

timestamp_ms – dấu thời gian (in) của khung này tính bằng mili giây. Thời lượng của một khung hình sẽ được tính là "dấu thời gian của khung hình tiếp theo – dấu thời gian của khung này". Do đó, dấu thời gian phải theo thứ tự không giảm.

config – (in) các tuỳ chọn mã hoá; có thể được chuyển thành giá trị NULL để chọn các giá trị mặc định hợp lý.

Trả bóng

Khi gặp lỗi, trả về false và frame->error_code được thiết lập thích hợp. Nếu không, giá trị trả về sẽ là true.

int WebPAnimEncoderAdd(
    WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
    const struct WebPConfig* config);

WebPAnimEncoderAssemble()

Tập hợp tất cả các khung đã thêm vào luồng bit WebP. Lệnh gọi này phải được thực hiện trước bằng lệnh gọi WebPAnimEncoderAddframe = NULL. Nếu không, thời lượng của khung cuối cùng sẽ được ước tính nội bộ.

Các tham số

enc – đối tượng (vào/ra) mà từ đó các khung sẽ được lắp ráp.

webp_data – (out) luồng bit WebP tạo ra.

Trả bóng

Thật thành công.

int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data);

WebPAnimEncoderGetError()

Lấy chuỗi lỗi tương ứng với lệnh gọi gần đây nhất bằng enc. Chuỗi được trả về thuộc sở hữu của enc và chỉ hợp lệ cho đến khi có lệnh gọi tiếp theo đến WebPAnimEncoderAdd(), WebPAnimEncoderAssemble() hoặc WebPAnimEncoderDelete().

Các tham số
enc – đối tượng (vào/ra) mà từ đó chuỗi lỗi sẽ được tìm nạp.
Trả bóng
NULL if enc is NULL. Ngược lại, trả về chuỗi lỗi nếu lệnh gọi cuối cùng đến enc có lỗi, hoặc một chuỗi trống nếu lệnh gọi gần nhất thành công.
const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);

WebPAnimEncoderDelete()

Xoá đối tượng WebPAnimEncoder.

Các tham số
enc – đối tượng (vào/ra) cần xoá
void WebPAnimEncoderDelete(WebPAnimEncoder* enc);

API Demux

Bật tính năng trích xuất hình ảnh và dữ liệu định dạng mở rộng từ các tệp WebP.

Ví dụ về mã

Trích xuất dữ liệu WebP để trích xuất tất cả các khung, hồ sơ ICC và siêu dữ liệu 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);

Vòng đời của đối tượng 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()

Trả về số phiên bản của thư viện demux, được đóng gói bằng hệ thập lục phân sử dụng 8 bit cho mỗi giá trị chính/phụ/bản sửa đổi. Ví dụ: phiên bản 2.5.7 là 0x020507.

int WebPGetDemuxVersion(void);

WebPDemux()

Phân tích cú pháp toàn bộ tệp WebP do data cung cấp.

WebPDemuxer WebPDemux(const WebPData* data);

Trả về đối tượng WebPDemuxer khi phân tích cú pháp thành công, nếu không thì trả về giá trị NULL.

WebPDemuxPartial()

Phân tích cú pháp tệp WebP có thể chưa hoàn chỉnh do data cung cấp. Nếu state (trạng thái) không phải là NULL, thì nó sẽ được đặt để cho biết trạng thái của bộ điều chỉnh độ sáng.

WebPDemuxer WebPDemuxPartial(const WebPData* data, WebPDemuxState* state);

Trả về giá trị NULL trong trường hợp xảy ra lỗi hoặc nếu không có đủ dữ liệu để bắt đầu phân tích cú pháp; và trả về đối tượng WebPDemuxer khi phân tích cú pháp thành công.

Xin lưu ý rằng WebPDemuxer lưu giữ các con trỏ nội bộ đến phân đoạn bộ nhớ data. Nếu dữ liệu này biến động, đối tượng bộ chuyển đổi sẽ bị xoá (bằng cách gọi WebPDemuxDelete()) và WebPDemuxPartial() được gọi lại trên dữ liệu mới. Đây thường là một thao tác không tốn kém.

WebPDemuxDelete()

Giải phóng bộ nhớ liên kết với dmux.

void WebPDemuxDelete(WebPDemuxer* dmux);

Trích xuất dữ liệu/thông tin

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()

Nhận giá trị feature từ dmux.

uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature);

Lưu ý: Giá trị chỉ hợp lệ nếu WebPDemux() được sử dụng hoặc WebPDemuxPartial() trả về một trạng thái > WEBP_DEMUX_PARSING_HEADER.

Lặp lại khung

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()

Truy xuất frame_number khung từ dmux.

int WebPDemuxGetFrame(const WebPDemuxer* dmux,
                      int frame_number,
                      WebPIterator* iter);

iter->fragment trỏ đến mảnh đầu tiên khi được trả về từ hàm này. Bạn có thể trích xuất từng mảnh bằng WebPDemuxSelectFragment(). Việc đặt frame_number bằng 0 sẽ trả về khung hình cuối cùng của hình ảnh.

Trả về false nếu dmux là NULL hoặc không có khung frame_number. Gọi WebPDemuxReleaseIterator() khi sử dụng xong trình lặp.

Lưu ý: dmux phải duy trì trong suốt thời gian hoạt động của iter.

WebPDemuxNextFrame(), WebPDemuxPrevFrame()

Đặt iter->fragment để trỏ đến khung tiếp theo (iter->frame_num + 1) hoặc trước (iter->frame_num - 1). Các hàm này không lặp lại.

int WebPDemuxNextFrame(WebPIterator* iter);
int WebPDemuxPrevFrame(WebPIterator* iter);

Trả về true khi thành công, trả về false nếu không thành công.

WebPDemuxSelectFragment()

Đặt iter->fragment để phản ánh số mảnh fragment_num.

int WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);

Trả về giá trị true nếu có mảnh fragment_num, nếu không có giá trị trả về là false (sai).

WebPDemuxReleaseIterator()

Giải phóng mọi bộ nhớ liên kết với iter.

void WebPDemuxReleaseIterator(WebPIterator* iter);

Phải được gọi trước mọi lệnh gọi tiếp theo đến WebPDemuxGetChunk() trên cùng một vòng lặp. Ngoài ra, phải được gọi trước khi huỷ WebPDemuxer được liên kết bằng WebPDemuxDelete().

Lặp lại phân đoạn

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()

Truy xuất thực thể chunk_number của đoạn có mã fourcc từ dmux.

int WebPDemuxGetChunk(const WebPDemuxer* dmux,
                      const char fourcc[4], int chunk_number,
                      WebPChunkIterator* iter);

fourcc là một mảng ký tự chứa 4cc của phân đoạn cần trả về, ví dụ: "ICCP", "XMP ", "EXIF", v.v.

Việc đặt chunk_number bằng 0 sẽ trả về phân đoạn cuối cùng trong một tập hợp.

Trả về true nếu tìm thấy phân đoạn, nếu không thì trả về false. Bạn có thể truy cập tải trọng phân đoạn liên quan đến hình ảnh thông qua WebPDemuxGetFrame() và các hàm liên quan. Gọi WebPDemuxReleaseChunkIterator() khi sử dụng xong trình lặp.

Lưu ý: dmux phải duy trì trong suốt thời gian hoạt động của trình lặp.

WebPDemuxNextChunk(), WebPDemuxPrevChunk()

Đặt iter->chunk để trỏ đến đoạn tiếp theo (iter->chunk_num + 1) hoặc trước (iter->chunk_num – 1). Các hàm này không lặp lại.

int WebPDemuxNextChunk(WebPChunkIterator* iter);
int WebPDemuxPrevChunk(WebPChunkIterator* iter);

Trả về true khi thành công, trả về false nếu không thành công.

WebPDemuxReleaseChunkIterator()

Giải phóng mọi bộ nhớ liên kết với iter.

void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);

Phải được gọi trước khi huỷ WebPDemuxer được liên kết bằng WebPDemuxDelete().

API WebPAnimDecoder

API này cho phép giải mã (có thể) hình ảnh WebP động.

Ví dụ về mã

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, &timestamp);
    // ... (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.

Tuỳ chọn chung

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()

Phải luôn được gọi để khởi chạy cấu trúc WebPAnimDecoderOptions mới trước khi sửa đổi. Trả về false trong trường hợp phiên bản không khớp. WebPAnimDecoderOptionsInit() phải thành công trước khi sử dụng đối tượng dec_options.

Các tham số

dec_options -- (vào/out) dùng để giải mã ảnh động

Trả bóng
Đúng khi thành công
int WebPAnimDecoderOptionsInit(
    WebPAnimDecoderOptions* dec_options);

WebPAnimDecoderNew()

Tạo và khởi động đối tượng WebPAnimDecoder.

Các tham số

webp_data – luồng bit WebP (in). Thuộc tính này sẽ không thay đổi trong suốt thời gian hoạt động của đối tượng WebPAnimDecoder đầu ra.

dec_options -- (in) giải mã tùy chọn. Có thể truyền giá trị NULL để chọn các giá trị mặc định hợp lý (cụ thể là chế độ màu MODE_RGBA sẽ được chọn).

Trả bóng

Con trỏ đến đối tượng WebPAnimDecoder mới tạo hoặc NULL trong trường hợp lỗi phân tích cú pháp, tuỳ chọn không hợp lệ hoặc lỗi bộ nhớ.

WebPAnimDecoder* WebPAnimDecoderNew(
    const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options);

Thông tin chung về ảnh động.

struct WebPAnimInfo {
  uint32_t canvas_width;
  uint32_t canvas_height;
  uint32_t loop_count;
  uint32_t bgcolor;
  uint32_t frame_count;
};

WebPAnimDecoderGetInfo()

Nhận thông tin chung về ảnh động.

Các tham số

dec – (trong) phiên bản bộ giải mã để lấy thông tin.

info – (out) thông tin chung được tìm nạp từ ảnh động.

Trả bóng

Thật thành công.

int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
                           WebPAnimInfo* info);

WebPAnimDecoderGetNext()

Tìm nạp khung tiếp theo từ ngày tháng 12 dựa trên các tuỳ chọn được cung cấp cho WebPAnimDecoderNew(). Đây sẽ là một canvas được dựng lại hoàn toàn có kích thước canvas_width * 4 * canvas_height, chứ không chỉ là hình chữ nhật phụ của khung. Bộ đệm buf được trả về chỉ hợp lệ cho đến khi lệnh gọi tiếp theo đến WebPAnimDecoderGetNext(), WebPAnimDecoderReset() hoặc WebPAnimDecoderDelete().

Các tham số

dec – thực thể bộ giải mã (vào/ra) mà khung tiếp theo sẽ được tìm nạp từ đó.

buf – khung đã giải mã (out).

timestamp – dấu thời gian (out) của khung tính bằng mili giây.

Trả bóng

False nếu bất kỳ đối số nào là NULL, hoặc nếu xảy ra lỗi phân tích cú pháp/giải mã, hoặc nếu không có thêm khung hình nào. Nếu không, giá trị trả về sẽ là true.

int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
                           uint8_t** buf, int* timestamp);

WebPAnimDecoderHasMoreFrames()

Kiểm tra xem còn khung hình nào để giải mã hay không.

Các tham số
tháng 12 – thực thể bộ giải mã (in) cần được kiểm tra.
Trả bóng
True nếu dec không phải là NULL và một số khung chưa được giải mã. Nếu không, trả về false.
int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);

WebPAnimDecoderReset()

Đặt lại đối tượng WebPAnimDecoder, để lệnh gọi tiếp theo đến WebPAnimDecoderGetNext() sẽ bắt đầu lại quá trình giải mã từ khung hình đầu tiên. Điều này sẽ hữu ích khi tất cả các khung cần được giải mã nhiều lần (ví dụ: info.loop_count lần) mà không huỷ và tạo lại đối tượng dec.

Các tham số
tháng 12 – thực thể bộ giải mã (vào/ra) cần đặt lại
void WebPAnimDecoderReset(WebPAnimDecoder* dec);

WebPAnimDecoderGetDemuxer()

Lấy đối tượng bộ chuyển đổi bên trong.

Việc lấy đối tượng bộ chuyển đổi (demuxer) có thể hữu ích nếu người dùng chỉ muốn sử dụng các thao tác có sẵn thông qua bộ điều chỉnh độ phân giải; ví dụ: để lấy siêu dữ liệu XMP/EXIF/ICC. Đối tượng trình điều khiển được trả về thuộc sở hữu của dec và chỉ có hiệu lực cho đến lệnh gọi tiếp theo đến WebPAnimDecoderDelete().

Các tham số
dec – (trong) thực thể bộ giải mã mà từ đó đối tượng demuxer sẽ được tìm nạp.
const WebPDemuxer* WebPAnimDecoderGetDemuxer(const WebPAnimDecoder* dec);

WebPAnimDecoderDelete()

Xoá đối tượng WebPAnimDecoder.

Các tham số
tháng 12 – thực thể bộ giải mã (vào/ra) cần bị xoá.
Trả bóng
Đúng về thành công.
void WebPAnimDecoderDelete(WebPAnimDecoder* dec);

Các loại dữ liệu phổ biến

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()

Khởi động nội dung của đối tượng webp_data bằng các giá trị mặc định.

void WebPDataInit(WebPData* webp_data);

WebPDataClear()

Xoá nội dung của đối tượng webp_data bằng cách gọi free(). Không tự phân bổ đối tượng.

void WebPDataClear(WebPData* webp_data);

WebPDataCopy()

Phân bổ bộ nhớ cần thiết cho dst và sao chép nội dung của src. Trả về true khi thành công.

int WebPDataCopy(const WebPData* src, WebPData* dst);