Thao tác với vùng chứa RIFF đối với hình ảnh WebP.
API Mux
Cho phép thao túng hình ảnh vùng chứa WebP, chứa các tính năng như màu sắc cấu hình, siêu dữ liệu, ảnh động và hình ảnh phân mảnh.
Ví dụ về mã
Tạo MUX với 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 hồ sơ 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 một đố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 theo hệ thập lục phân sử dụng
8 bit cho mỗi phần chính/nhỏ/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);
- Giá trị trả về
- Con trỏ trỏ đến đối tượng mux trống mới tạo.
WebPMuxDelete()
Xoá đối tượng mux.
void WebPMuxDelete(WebPMux* mux);
- Tham số
- mux – đối tượng (vào/ra) sẽ bị xoá
Tạo tệp Mux
WebPMuxCreate()
Tạo một đố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);
- Tham số
luồng bit – (trong) dữ liệu luồng bit ở định dạng WebP RIFF
copy_data – giá trị (in) 1 cho biết dữ liệu đã cho SẼ được sao chép sang tệp mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép vào đối tượng mux.
- Giá trị trả về
Một con trỏ trỏ đến đối tượng mux được tạo từ dữ liệu đã cho – khi thành công.
NULL -- Trong trường hợp có lỗi dữ liệu hoặc bộ nhớ không hợp lệ.
Đoạn không phải hình ảnh
WebPMuxSetChunk()
Thêm một phân đoạn có mã fourcc và dữ liệu chunk_data trong đối tượng mux. Bất kỳ hạng nào (các) đoạn hiện tại có cùng mã thì 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 đ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"). Cách thêm:
tải và xoá hình ảnh, hãy sử dụng WebPMuxSetImage()
,
WebPMuxPushFrame()
,
WebPMuxGetFrame()
và
WebPMuxDeleteFrame()
.
- Tham số
mux – đối tượng (vào/ra) mà đoạn sẽ được thêm vào
fourcc – (trong) một mảng ký tự chứa bốncc của chunk; ví dụ: "ICCP", "XMP", "EXIF" và hơn thế nữa
chunk_data – (trong) dữ liệu phân đoạn cần thêm
copy_data – giá trị (in) 1 cho biết dữ liệu đã cho SẼ được sao chép sang tệp mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép vào đối tượng mux.
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux, 4cc hoặc chunk_data là giá trị NULL hoặc nếu bốncc tương ứng với một đoạn hình ảnh.WEBP_MUX_MEMORY_ERROR
– về 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);
- 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 đoạn; ví dụ: "ICCP", "XMP", "EXIF" và hơn thế nữa
chunk_data – (out) trả về dữ liệu phân đoạn
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux, 4cc hoặc chunk_data là giá trị NULL hoặc nếu bốncc tương ứng với một đoạn hình ảnh.WEBP_MUX_NOT_FOUND
– Nếu mux không chứa phân đoạn có giá trị mã nhận dạng.WEBP_MUX_OK
-- khi thành công.
WebPMuxDeleteChunk()
Xoá đoạn có fourcc đã cho khỏi đối tượng mux.
WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]);
- Tham số
mux – đối tượng (vào/ra) mà từ đó đoạn sẽ bị xoá
fourcc – (trong) một mảng ký tự chứa 4cc của đoạn; ví dụ: "ICCP", "XMP", "EXIF" và hơn thế nữa
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux hoặc4cc là NULL hoặc nếu là bốncc tương ứng với một đoạn hình ảnh.WEBP_MUX_NOT_FOUND
– Nếu mux không chứa phân đoạn có giá trị 4 cc.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 bị 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);
- Tham số
mux – đối tượng (vào/ra) mà trong đó hình ảnh sẽ được đặt
bitstream – (in) có thể là luồng bit VP8/VP8L thô hoặc WebP đơn hình ảnh tệp (không động và không bị phân mảnh)
copy_data – giá trị (in) 1 cho biết dữ liệu đã cho SẼ được sao chép sang tệp mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép vào đối tượng mux.
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux là giá trị NULL hoặc luồng bit là giá trị NULL.WEBP_MUX_MEMORY_ERROR
– về 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 mux.
WebPMuxError WebPMuxPushFrame(WebPMux* mux,
const WebPMuxFrameInfo* frame,
int copy_data);
Lưu ý:
- frame.id phải là một trong
WEBP_CHUNK_ANMF
hoặcWEBP_CHUNK_FRGM
- Để đặt hình ảnh tĩnh, không phân mảnh, hãy sử dụng
WebPMuxSetImage()
. - Loại khung được đẩy phải giống với khung ở chế độ kết hợp.
- Vì WebP chỉ hỗ trợ độ lệch chẵn, nên mọi độ lệch lẻ sẽ bị chụp nhanh đến vị trí bằng nhau sử dụng: độ lệch &= ~1
- Tham số
mux – đối tượng (vào/ra) mà khung hình sẽ được thêm vào
frame -- dữ liệu (trong) khung.
copy_data – giá trị (in) 1 cho biết dữ liệu đã cho SẼ được sao chép sang tệp mux và giá trị 0 cho biết dữ liệu sẽ KHÔNG được sao chép vào đối tượng mux.
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux hoặc khung là NULL hoặc nếu nội dung của khung là không hợp lệ.WEBP_MUX_MEMORY_ERROR
– về lỗi phân bổ bộ nhớ.WEBP_MUX_OK
-- khi thành công.WEBP_MUX_MEMORY_ERROR
– về 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 là
được phân bổ bằng Malloc() và KHÔNG thuộc sở hữu của đối tượng mux. Phải là
được phương thức gọi giải quyết bằng cách gọi WebPDataClear()
. n=0
có ý nghĩa đặc biệt - vị trí cuối cùng.
WebPMuxError WebPMuxGetFrame(const WebPMux* mux,
uint32_t nth,
WebPMuxFrameInfo* frame);
- Tham số
mux – đối tượng (trong) mà từ đó thông tin được tìm nạp
nth – chỉ mục (in) của khung trong đối tượng mux
frame -- dữ liệu (out) của khung được trả về
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
-- if mux or frame is NULL.WEBP_MUX_NOT_FOUND
– nếu có ít hơn khung thứ n trong tệp kết hợp .WEBP_MUX_BAD_DATA
– nếu đoạn khung thứ n trong chương trình kết hợp 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 - cuối cùng vị trí.
WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
- Tham số
mux – đối tượng (vào/ra) mà từ đó khung hình sẽ bị xoá
nth -- (in) Vị trí mà khung hình sẽ bị xoá từ đó
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
-- if mux is NULL.WEBP_MUX_NOT_FOUND
– Nếu có ít hơn khung thứ n trong tệp kết hợp 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ị gỡ bỏ.
WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
const WebPMuxAnimParams* params);
- Tham số
mux – đối tượng (vào/ra) trong đó đoạn ANIM sẽ được đặt/thêm vào
params - tham số ảnh động (in).
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux hoặc tham số là giá trị NULL.WEBP_MUX_MEMORY_ERROR
– về 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);
- Tham số
mux – đối tượng (trong) mà từ đó tham số ảnh động được tìm nạp
params - tham số ảnh động (out) được trích xuất từ phân đoạn ANIM
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
– nếu mux hoặc tham số là giá trị NULL.WEBP_MUX_NOT_FOUND
– nếu đoạn ANIM không có trong đối tượng mux.WEBP_MUX_OK
-- khi thành công.
Công tác thi công phụ trợ khác Phần mềm tiện ích
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 thức này giả định rằng phân đoạn VP8X (nếu có) đã được cập nhật.
Tức 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()
.
- Tham số
mux – đối tượng (trong) mà từ đó kích thước canvas được tìm nạp
width -- (out) chiều rộng canvas
height -- (out) chiều cao canvas
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
-- if mux, width or height is NULL.WEBP_MUX_BAD_DATA
– nếu phân đoạn VP8X/VP8/VP8L hoặc kích thước canvas 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 thức này giả định rằng phân đoạn VP8X (nếu có) đã được cập nhật.
Tức 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()
.
- Tham số
mux – đối tượng (trong) mà từ đó các đối tượng sẽ được tìm nạp
flags -- (bỏ) cờ chỉ định tính năng nào có trong tệp tổng hợp . Đây sẽ là OR của nhiều giá trị cờ. Liệt kê
WebPFeatureFlags
có thể được sử dụng để kiểm tra từng giá trị cờ.- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
-- if mux or flags is NULL.WEBP_MUX_BAD_DATA
– nếu phân đoạn VP8X/VP8/VP8L hoặc kích thước canvas không hợp lệ.WEBP_MUX_OK
-- khi thành công.
WebPMuxNumChunks()
Lấy số lượng phần có giá trị thẻ nhất định trong đối tượng mux.
WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
WebPChunkId id,
int* num_elements);
- Tham số
mux – đối tượng (trong) mà từ đó thông tin được tìm nạp
id – (trong) mã phân đoạn chỉ định loại phân đoạn
num_elements – số lượng phân đoạn (ra) có mã phân đoạn đã cho
- Giá trị trả về
WEBP_MUX_INVALID_ARGUMENT
-- if mux, or num_elements is 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ề trong 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à NOT
thuộc sở hữu của đối tượng mux. Số điện thoại PHẢI được phương thức gọi giải quyết bằng cách gọi
WebPDataClear()
.
- Tham số
mux – (vào/ra) đối tượng có các đoạn cần được lắp ráp
assembled_data – dữ liệu WebP được tập hợp (ngoài)
- Giá trị trả về
WEBP_MUX_BAD_DATA
– nếu đối tượng mux không hợp lệ.WEBP_MUX_INVALID_ARGUMENT
-- if mux or assembled_data is NULL.WEBP_MUX_MEMORY_ERROR
– về 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.
Lựa 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 một WebPAnimEncoderOptions mới cấu trúc 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 enc_options.
- Tham số
- enc_options – các tuỳ chọn (in/out) dùng để mã hoá ảnh động
- Giá trị trả về
- Đúng là thành công.
int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderNew()
Tạo và khởi tạo một đối tượng WebPAnimEncoder.
- Tham số
width/height -- (in) chiều rộng và chiều cao canvas của ảnh động.
enc_options – tuỳ chọn mã hoá (in); có thể được thông qua giá trị NULL để chọn mặc định hợp lý.
- Giá trị trả về
Con trỏ trỏ đến đối tượng WebPAnimEncoder mới tạo hoặc NULL trong trường hợp lỗi bộ nhớ.
WebPAnimEncoder* WebPAnimEncoderNew(
int width, int height, const WebPAnimEncoderOptions* enc_options);
WebPAnimEncoderAdd()
Tối ưu hoá khung hình cụ thể cho WebP, mã hoá rồi thêm khung hình đó vào WebPAnimEncoder.
Lệnh gọi gần đây nhất đến WebPAnimEncoderAdd phải có frame = NULL
, tức là
cho biết rằng không cần thêm khung nào khác. Lệnh gọi này cũng được dùng để
xác định thời lượng của khung hình cuối cùng.
- Tham số
enc – đối tượng (vào/ra) mà khung hình sẽ được thêm vào.
frame -- dữ liệu khung (vào/ra) ở định dạng ARGB hoặc YUV(A). Nếu quốc gia đó ở YUV(A), thì sẽ được chuyển đổi sang ARGB, do đó chịu một thiệt hại nhỏ.
timestamp_ms -- (trong) dấu thời gian của khung này tính bằng mili giây. Thời gian ngủ của một khung hình sẽ được tính là "dấu thời gian của khung 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 -- (trong) các tùy chọn mã hóa; có thể được chuyển giá trị NULL để chọn giá trị hợp lý. mặc định.
- Giá trị trả về
Khi có lỗi, trả về false và
frame->error_code
được đặt một cách thích hợp. Nếu không, hàm sẽ trả về giá trị 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 tính đến thời điểm hiện tại vào một luồng bit WebP. Cuộc gọi này sẽ
theo sau lệnh gọi đến WebPAnimEncoderAdd với frame = NULL
; nếu không,
thời lượng của khung hình cuối cùng sẽ được ước tính nội bộ.
- Tham số
enc – đối tượng (vào/ra) mà từ đó các khung sẽ được lắp ráp.
webp_data – (ngoài) luồng bit WebP được tạo.
- Giá trị trả về
Đúng là thành công.
int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data);
WebPAnimEncoderGetError()
Nhận chuỗi lỗi tương ứng với lệnh gọi gần đây nhất bằng enc. Chiến lược phát hành đĩa đơn
chuỗi trả về thuộc sở hữu của enc và chỉ hợp lệ cho đến khi thực hiện lệnh gọi tiếp theo
WebPAnimEncoderAdd()
hoặc
WebPAnimEncoderAssemble()
hoặc
WebPAnimEncoderDelete()
- Tham số
- enc – đối tượng (vào/ra) mà từ đó chuỗi lỗi sẽ được tìm nạp.
- Giá trị trả về
- NULL if enc is NULL. Nếu không, hàm sẽ trả về chuỗi lỗi nếu giá trị cuối cùng lệnh gọi đến enc đã gặp lỗi hoặc chuỗi trống nếu lệnh gọi gần đây nhất là thành công.
const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
WebPAnimEncoderDelete()
Xoá đối tượng WebPAnimEncoder.
- Tham số
- enc – đối tượng (vào/ra) sẽ bị xoá
void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
API Demux
Cho phép trích xuất hình ảnh và dữ liệu định dạng mở rộng từ tệp WebP.
Ví dụ về mã
Gỡ bỏ dữ liệu WebP để trích xuất tất cả các khung hình, cấu hình 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 theo hệ thập lục phân sử dụng
8 bit cho mỗi phần chính/nhỏ/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 tệp WebP đầy đủ do dữ liệu 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 dữ liệu cung cấp. Nếu state là không phải là NULL (Rỗng), thì nó sẽ được đặt để cho biết trạng thái của bộ demuxer.
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à đối tượng WebPDemuxer
khi phân tích cú pháp thành công.
Xin lưu ý rằng WebPDemuxer
giữ con trỏ nội bộ đến phân đoạn bộ nhớ dữ liệu. Nếu
dữ liệu này có biến động, nên đối tượng bộ phân bổ sẽ bị xoá (bằng cách gọi
WebPDemuxDelete()
) và
Đã gọi lại WebPDemuxPartial()
trên dữ liệu mới. Đây là
thường là một thao tác có chi phí thấp.
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()
Lấy giá trị feature từ dmux.
uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature);
Lưu ý: Các giá trị chỉ hợp lệ nếu bạn đã dùng WebPDemux()
hoặc
WebPDemuxPartial()
trả về một trạng thái >
WEBP_DEMUX_PARSING_HEADER
.
Lặp lại khung hình
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 khung frame_number từ dmux.
int WebPDemuxGetFrame(const WebPDemuxer* dmux,
int frame_number,
WebPIterator* iter);
iter->fragment trỏ đến mảnh đầu tiên khi trả về qua hàm này.
Có thể trích xuất từng mảnh bằng
WebPDemuxSelectFragment()
. Chế độ cài đặt
frame_number bằng 0 sẽ trả về khung cuối cùng của hình ảnh.
Trả về false nếu dmux là giá trị NULL hoặc không có khung dmux.
Gọi WebPDemuxReleaseIterator()
khi sử dụng
biến lặp đã hoàn tất.
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 mảnh tiếp theo (iter->fragment + 1) hoặc khung 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 iter->fragment.
int WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);
Trả về giá trị true nếu có mảnh fragment_num, nếu không thì trả về giá trị false.
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 tới
WebPDemuxGetChunk()
trên cùng một lần 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 bản sao chunk_number của phân đ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 đ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 tập hợp.
Trả về true nếu tìm thấy phân đoạn, trả về false nếu không tìm thấy phân đoạn. Đoạn có liên quan đến hình ảnh
các tải trọng dữ liệu được truy cập thông qua WebPDemuxGetFrame()
và các hàm liên quan. Gọi điện
WebPDemuxReleaseChunkIterator()
khi sử dụng
của biến lặp đã hoàn tất.
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 phần tiếp theo (iter->chunk_num + 1) hoặc đoạn 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, ×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.
Lựa 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 một WebPAnimDecoderOptions mới cấu trúc 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 dec_options.
Tham số
dec_options – các tuỳ chọn (vào/ra) dùng để giải mã ảnh động
- Giá trị trả về
- Đúng là thành công
int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options);
WebPAnimDecoderNew()
Tạo và khởi tạo đối tượng WebPAnimDecoder.
- Tham số
webp_data – (trong) luồng bit WebP. Tác vụ này phải không thay đổi trong thời gian thời gian tồn tại của đối tượng đầu ra WebPAnimDecoder.
dec_options – (trong) cách giải mã. Có thể được đặt giá trị NULL để chọn mặc định hợp lý (cụ thể là chế độ màu MODE_RGBA sẽ được chọn).
- Giá trị trả về
Con trỏ 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.
- 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.
- Giá trị trả về
Đúng là thành công.
int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
WebPAnimInfo* info);
WebPAnimDecoderGetNext()
Tìm nạp khung tiếp theo từ tháng 12 dựa trên các tuỳ chọn được cung cấp cho
WebPAnimDecoderNew()
. Đây sẽ là
canvas được tái tạo có kích thước canvas_width * 4 * canvas_height
, chứ không chỉ
hình chữ nhật phụ của khung. Vùng đệm được trả về buf chỉ hợp lệ cho đến khi
cuộc gọi tiếp theo đến WebPAnimDecoderGetNext()
,
WebPAnimDecoderReset()
hoặc
WebPAnimDecoderDelete()
.
- Tham số
dec – phiên bản bộ giải mã (vào/ra) mà từ đó khung hình tiếp theo sẽ xuất hiện đã được tìm nạp.
buf -- (out) khung được giải mã.
timestamp -- dấu thời gian (hết) của khung hình tính bằng mili giây.
- Giá trị trả về
False nếu có bất kỳ đối số nào là NULL hoặc nếu có lệnh phân tích cú pháp hoặc hoặc nếu không còn khung nào nữa. Nếu không, hàm sẽ trả về giá trị true.
int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
uint8_t** buf, int* timestamp);
WebPAnimDecoderHasMoreFrames()
Kiểm tra xem còn khung hình nào khác để giải mã hay không.
- Tham số
- dec -- (trong) phiên bản bộ giải mã cần kiểm tra.
- Giá trị trả về
- True nếu dec không phải là giá trị 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ẽ khởi động lại quá trình giải mã
từ khung thứ nhất. Đ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.
- Tham số
- dec -- phiên bản bộ giải mã (vào/ra) cần đặt lại
void WebPAnimDecoderReset(WebPAnimDecoder* dec);
WebPAnimDecoderGetDemuxer()
Lấy đối tượng bộ phân bổ bên trong.
Việc lấy đối tượng 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ộ phân bổ; ví dụ: để nhận siêu dữ liệu XMP/EXIF/ICC. Được trả về
đối tượng demuxer thuộc sở hữu của dec và chỉ hợp lệ cho đến khi thực hiện lệnh gọi tiếp theo đến
WebPAnimDecoderDelete()
.
- Tham số
- dec -- (in) 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.
- Tham số
- dec – phiên bản bộ giải mã (vào/ra) cần xoá.
- Giá trị trả về
- Đúng là 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
phân bổ chính đối tượng.
void WebPDataClear(WebPData* webp_data);
WebPDataCopy()
Phân bổ dung lượng lưu trữ cần thiết cho dst và sao chép nội dung của src. Trả về giá trị true khi thành công.
int WebPDataCopy(const WebPData* src, WebPData* dst);