WebP API Belgeleri

Bu bölümde, pakete dahil olan kodlayıcı ve kod çözücü API'si açıklanmaktadır. depolarsınız. Bu API açıklaması sürümle ilgili 1.4.0.

Başlıklar ve Kitaplıklar

libwebp adlı dizini yüklediğinizde webp/ adlı bir dizin platformunuzun genel konumuna yüklenir. Örneğin, aşağıdaki başlık dosyaları, Unix platformlarında /usr/local/include/webp/

decode.h
encode.h
types.h

Kitaplıklar normal kitaplık dizinlerinde bulunur. Statik ve dinamik kitaplıklar, Unix platformlarında /usr/local/lib/ konumunda bulunur.

Basit Kod Çözme API'sı

Kod çözme API'sini kullanmaya başlamak için açıklandığı şekilde yüklenen kitaplık ve başlık dosyaları yukarıda.

Kod çözme API başlığını C/C++ kodunuza aşağıdaki gibi ekleyin:

#include "webp/decode.h"
int WebPGetInfo(const uint8_t* data, size_t data_size, int* width, int* height);

Bu işlev, WebP resim başlığını doğrular ve resim genişliğini alır ve yüksekliği belirtmelisiniz. *width ve *height işaretçileri, kabul edilirse NULL iletilebilir Alakasız.

Giriş Özellikleri

veri
İşaretçiden WebP resim verilerine yönlendirme
veri_boyutu
Bu, data tarafından işaret edilen bellek bloğunun boyutudur. resim verileri.

İadeler

false
(a) Biçimlendirme hataları durumunda döndürülen hata kodu.
true
Başarı üzerine. *width ve *height yalnızca başarılı iade durumunda geçerlidir.
genişlik
Tam sayı değeri. Bu aralık 1 ile 16.383 arasında sınırlıdır.
yükseklik
Tam sayı değeri. Aralık 1 ile 16383 arasında sınırlıdır.
struct WebPBitstreamFeatures {
  int width;          // Width in pixels.
  int height;         // Height in pixels.
  int has_alpha;      // True if the bitstream contains an alpha channel.
  int has_animation;  // True if the bitstream is an animation.
  int format;         // 0 = undefined (/mixed), 1 = lossy, 2 = lossless
}

VP8StatusCode WebPGetFeatures(const uint8_t* data,
                              size_t data_size,
                              WebPBitstreamFeatures* features);

Bu işlev, özellikleri bit akışından alır. *features yapısı, bit akışından toplanan bilgilerle doldurulur:

Giriş Özellikleri

veri
İşaretçiden WebP resim verilerine yönlendirme
veri_boyutu
Bu, data tarafından işaret edilen bellek bloğunun boyutudur. resim verileri.

İadeler

VP8_STATUS_OK
Özellikler başarıyla alındığında.
VP8_STATUS_NOT_ENOUGH_DATA
Başlıklardaki özellikleri almak için daha fazla veri gerektiğinde.

Başka durumlarda ek VP8StatusCode hata değerleri.

özellikler
İşaretçi ile WebPBitstreamFeatures yapısı.
uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, int* width, int* height);
uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, int* width, int* height);
uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, int* width, int* height);
uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, int* width, int* height);
uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, int* width, int* height);

Bu işlevler data ile işaret edilen bir WebP görüntüsünün kodunu çözer.

  • WebPDecodeRGBA, [r0, g0, b0, a0, r1, g1, b1, a1, ...] sırayla RGBA resim örnekleri döndürür.
  • WebPDecodeARGB, [a0, r0, g0, b0, a1, r1, g1, b1, ...] sırada ARGB resim örnekleri döndürür.
  • WebPDecodeBGRA, [b0, g0, r0, a0, b1, g1, r1, a1, ...] siparişte BGRA resim örneklerini döndürür.
  • WebPDecodeRGB, [r0, g0, b0, r1, g1, b1, ...] sırada RGB resim örnekleri döndürür.
  • WebPDecodeBGR, [b0, g0, r0, b1, g1, r1, ...] siparişte BGR resim örneklerini döndürür.

Bu işlevlerden herhangi birini çağıran kodun veri arabelleğini silmesi gerekir (uint8_t*), bu işlevler tarafından WebPFree() ile döndürüldü.

Giriş Özellikleri

veri
İşaretçiden WebP resim verilerine yönlendirme
veri_boyutu
Bu, data tarafından işaret edilen bellek bloğunun boyutudur. görüntü verileri
genişlik
Tam sayı değeri. Bu aralık şu anda 1 ile 16.383 arasında sınırlıdır.
yükseklik
Tam sayı değeri. Bu aralık şu anda 1 ile 16.383 ile sınırlıdır.

İadeler

uint8_t*
Doğrusal RGBA/ARGB/BGRA/RGB/BGR'de kodu çözülmüş WebP resim örneklerine işaretçi tıklayın.
uint8_t* WebPDecodeRGBAInto(const uint8_t* data, size_t data_size,
                            uint8_t* output_buffer, int output_buffer_size, int output_stride);
uint8_t* WebPDecodeARGBInto(const uint8_t* data, size_t data_size,
                            uint8_t* output_buffer, int output_buffer_size, int output_stride);
uint8_t* WebPDecodeBGRAInto(const uint8_t* data, size_t data_size,
                            uint8_t* output_buffer, int output_buffer_size, int output_stride);
uint8_t* WebPDecodeRGBInto(const uint8_t* data, size_t data_size,
                           uint8_t* output_buffer, int output_buffer_size, int output_stride);
uint8_t* WebPDecodeBGRInto(const uint8_t* data, size_t data_size,
                           uint8_t* output_buffer, int output_buffer_size, int output_stride);

Bu işlevler, yukarıdakilerin varyantlarıdır ve resmin kodunu doğrudan çözer bir arabelleğe (output_buffer) yapıştırın. Şuralarda kullanılabilecek maksimum depolama alanı: bu tampon output_buffer_size ile gösterilir. Bu depolama alanı (veya bir hata oluştu) NULL hatası döndürülür. Aksi halde output_buffer, kolaylık sağlamak amacıyla iade edildi.

output_stride parametresi, veriler arasındaki mesafeyi (bayt cinsinden) belirtir taranır. Bu nedenle, output_buffer_size değerinin en az olması bekleniyor output_stride * picture - height.

Giriş Özellikleri

veri
İşaretçiden WebP resim verilerine yönlendirme
veri_boyutu
Bu, data tarafından işaret edilen bellek bloğunun boyutudur. görüntü verileri
output_buffer_size
Tam sayı değeri. Ayrılan tamponun boyutu
output_stride
Tam sayı değeri. Tarama çizgileri arasındaki mesafeyi belirtir.

İadeler

output_buffer
Kodu çözülmüş WebP resminin işaretçisi.
uint8_t*
İşlev başarılı olursa output_buffer; Aksi takdirde NULL.

Gelişmiş Kod Çözme API'sı

WebP kod çözme özelliği, anında erişim imkanı sağlamak için gelişmiş bir API'yi destekler. kırpma ve yeniden ölçeklendirme işlevleri bulunur. Bu da bellek kısıtlamalı mobil cihazlar için de geçerlidir. Temel olarak bellek kullanımı, çıkışın boyutunu, girişin yalnızca hızlı önizlemeye veya yakınlaştırılmış bir resimdir. Bazı CPU'lar kaydedilebilir hem de tesadüfen.

WebP kod çözme, tam resim kodu çözme ve artımlı kod çözmeyi öğreteceğim. Kullanıcılar isteğe bağlı olarak harici bir resmin kodunu çözmek için bellek arabelleği. Aşağıdaki kod örneğine bakalım. gelişmiş kod çözme API'sini kullanma adımlarına değineceğiz.

Öncelikle bir yapılandırma nesnesini ilk kullanıma hazırlamamız gerekir:

#include "webp/decode.h"

WebPDecoderConfig config;
CHECK(WebPInitDecoderConfig(&config));

// One can adjust some additional decoding options:
config.options.no_fancy_upsampling = 1;
config.options.use_scaling = 1;
config.options.scaled_width = scaledWidth();
config.options.scaled_height = scaledHeight();
// etc.

Kod çözme seçenekleri WebPDecoderConfig içinde toplanır. yapı:

struct WebPDecoderOptions {
  int bypass_filtering;             // if true, skip the in-loop filtering
  int no_fancy_upsampling;          // if true, use faster pointwise upsampler
  int use_cropping;                 // if true, cropping is applied first 
  int crop_left, crop_top;          // top-left position for cropping.
                                    // Will be snapped to even values.
  int crop_width, crop_height;      // dimension of the cropping area
  int use_scaling;                  // if true, scaling is applied afterward
  int scaled_width, scaled_height;  // final resolution
  int use_threads;                  // if true, use multi-threaded decoding
  int dithering_strength;           // dithering strength (0=Off, 100=full)
  int flip;                         // if true, flip output vertically
  int alpha_dithering_strength;     // alpha dithering strength in [0..100]
};

İsteğe bağlı olarak bit akışı özellikleri config.input, uyarlayabilirsiniz. Örneğin, iş kırılım yapısının olup olmadığını kontrol edin. Bu işlemin bit akışının başlığını da ayrıştırır. Bu nedenle, olup olmadığını kontrol edin.

CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);

Sonra da kodu çözen bellek arabelleğini kurmamız gerekir. Belki bu tamponu kod çözücüye güvenmek yerine doğrudan uygulayabilirsiniz. Yapmamız gereken tek şey ve arabelleğin toplam boyutunu gösteren bir işaretleyiciyi belleğe satır adımı (tarama çizgileri arasındaki bayt cinsinden mesafe).

// Specify the desired output colorspace:
config.output.colorspace = MODE_BGRA;
// Have config.output point to an external buffer:
config.output.u.RGBA.rgba = (uint8_t*)memory_buffer;
config.output.u.RGBA.stride = scanline_stride;
config.output.u.RGBA.size = total_size_of_the_memory_buffer;
config.output.is_external_memory = 1;

Görüntünün kodu çözülmeye hazır. Kod çözme için iki olası varyant vardır resim. Aşağıdakileri kullanarak resmin kodunu tek seferde çözebiliriz:

CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);

Alternatif olarak, kodu kademeli olarak çözmek için artımlı yeni baytlar kullanılabilir hale geldikçe resmin üzerinde çalışır:

WebPIDecoder* idec = WebPINewDecoder(&config.output);
CHECK(idec != NULL);
while (additional_data_is_available) {
  // ... (get additional data in some new_data[] buffer)
  VP8StatusCode status = WebPIAppend(idec, new_data, new_data_size);
  if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
    break;
  }
  // The above call decodes the current available buffer.
  // Part of the image can now be refreshed by calling
  // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
}
WebPIDelete(idec);  // the object doesn't own the image memory, so it can
                    // now be deleted. config.output memory is preserved.

Kodu çözülmüş görüntü artık config.Exit'de (veya config.Exit.u.RGBA'da) bu örnekte, istenen çıkış renk alanı MODE_BGRA olduğu için). Resim kaydedilemez, görüntülenemez veya başka şekilde işlenemez. Daha sonra, yalnızca yapılandırmanın nesnesinde ayrılan belleği geri almamız gerekir. Hafızaya takılı değilse ve öyle değilse bile bu işlevi çağırmak güvenli WebPDecode() tarafından ayrılmış:

WebPFreeDecBuffer(&config.output);

Bu API kullanılarak görüntü, Sırasıyla MODE_YUV ve MODE_YUVA. Bu biçim Y'CbCr

Basit Kodlama API'sı

RGBA örneklerinin kodlama dizileri için çok basit bazı işlevler sağlanır kullanabilirsiniz. Bu beyanlar webp/encode.h'nda beyan edilmiştir. üstbilgi şu şekildedir:

size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output);
size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride, float quality_factor, uint8_t** output);
size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride, float quality_factor, uint8_t** output);
size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride, float quality_factor, uint8_t** output);

Kalite faktörü quality_factor 0 ile 100 arasında değişir Sıkıştırma sırasında kaybı ve kaliteyi kontrol eder. 0 değeri düşük değerine karşılık gelir 100 ise en yüksek kalite ve en büyük çıktı boyutlarıdır. çıktı boyutu. İşlem başarılı olursa, sıkıştırılmış baytlar *output içine yerleştirilir. ve bayt cinsinden boyut döndürülür (aksi durumda, nedeniyle). Arayan, *output numaralı telefondan WebPFree() adlı kişiyi aramalıdır işaretçiyi kullanın.

Giriş dizisi, paketlenmiş bir bayt dizisi olmalıdır (her kanal için beklenen sonucun elde edilmesine yardımcı olur. stride, bir satırdan diğerine atlamak için gereken bayt sayısıdır. Örneğin, BGRA düzeni:

Kayıpsız kodlama için imzalarla eşdeğer işlevler vardır:

size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height, int stride, uint8_t** output);
size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height, int stride, uint8_t** output);
size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height, int stride, uint8_t** output);
size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height, int stride, uint8_t** output);

Kayıplı sürümler gibi bu işlevlerin kitaplığın varsayılan ayarlarını kullandığını unutmayın Ayarlar'da devre dışı bırakabilirsiniz. Kayıpsız için bu, "tam" anlamına gelir devre dışı bırakıldı. RGB değerleri şeffaf alanlar, sıkıştırmayı iyileştirmek için değiştirilecek. Bunu önlemek için WebPEncode() ve WebPConfig::exact öğesini 1 olarak ayarlayın.

Gelişmiş Kodlama API'sı

Temelinde, kodlayıcı çok sayıda gelişmiş kodlama parametresiyle birlikte gelir. Bu öğeler, sıkıştırma işlemi arasındaki dengeyi daha iyi bir şekilde verimlilik ve işlem süresidir. Bu parametreler WebPConfig yapısı içinde toplanır. Bu yapının en çok kullanılan alanları şunlardır:

struct WebPConfig {
  int lossless;           // Lossless encoding (0=lossy(default), 1=lossless).
  float quality;          // between 0 and 100. For lossy, 0 gives the smallest
                          // size and 100 the largest. For lossless, this
                          // parameter is the amount of effort put into the
                          // compression: 0 is the fastest but gives larger
                          // files compared to the slowest, but best, 100.
  int method;             // quality/speed trade-off (0=fast, 6=slower-better)

  WebPImageHint image_hint;  // Hint for image type (lossless only for now).

  // Parameters related to lossy compression only:
  int target_size;        // if non-zero, set the desired target size in bytes.
                          // Takes precedence over the 'compression' parameter.
  float target_PSNR;      // if non-zero, specifies the minimal distortion to
                          // try to achieve. Takes precedence over target_size.
  int segments;           // maximum number of segments to use, in [1..4]
  int sns_strength;       // Spatial Noise Shaping. 0=off, 100=maximum.
  int filter_strength;    // range: [0 = off .. 100 = strongest]
  int filter_sharpness;   // range: [0 = off .. 7 = least sharp]
  int filter_type;        // filtering type: 0 = simple, 1 = strong (only used
                          // if filter_strength > 0 or autofilter > 0)
  int autofilter;         // Auto adjust filter's strength [0 = off, 1 = on]
  int alpha_compression;  // Algorithm for encoding the alpha plane (0 = none,
                          // 1 = compressed with WebP lossless). Default is 1.
  int alpha_filtering;    // Predictive filtering method for alpha plane.
                          //  0: none, 1: fast, 2: best. Default if 1.
  int alpha_quality;      // Between 0 (smallest size) and 100 (lossless).
                          // Default is 100.
  int pass;               // number of entropy-analysis passes (in [1..10]).

  int show_compressed;    // if true, export the compressed picture back.
                          // In-loop filtering is not applied.
  int preprocessing;      // preprocessing filter (0=none, 1=segment-smooth)
  int partitions;         // log2(number of token partitions) in [0..3]
                          // Default is set to 0 for easier progressive decoding.
  int partition_limit;    // quality degradation allowed to fit the 512k limit on
                          // prediction modes coding (0: no degradation,
                          // 100: maximum possible degradation).
  int use_sharp_yuv;      // if needed, use sharp (and slow) RGB->YUV conversion
};

Bu parametrelerin çoğuna deneme için erişilebildiğini unutmayın cwebp komut satırı aracını kullanın.

Giriş örnekleri, WebPPicture yapısına entegre edilmelidir. Bu yapı, giriş örneklerini RGBA veya YUVA biçiminde depolayabilir. use_argb işaretinin değerine eklenir.

Yapı aşağıdaki gibi düzenlenmiştir:

struct WebPPicture {
  int use_argb;              // To select between ARGB and YUVA input.

  // YUV input, recommended for lossy compression.
  // Used if use_argb = 0.
  WebPEncCSP colorspace;     // colorspace: should be YUVA420 or YUV420 for now (=Y'CbCr).
  int width, height;         // dimensions (less or equal to WEBP_MAX_DIMENSION)
  uint8_t *y, *u, *v;        // pointers to luma/chroma planes.
  int y_stride, uv_stride;   // luma/chroma strides.
  uint8_t* a;                // pointer to the alpha plane
  int a_stride;              // stride of the alpha plane

  // Alternate ARGB input, recommended for lossless compression.
  // Used if use_argb = 1.
  uint32_t* argb;            // Pointer to argb (32 bit) plane.
  int argb_stride;           // This is stride in pixels units, not bytes.

  // Byte-emission hook, to store compressed bytes as they are ready.
  WebPWriterFunction writer;  // can be NULL
  void* custom_ptr;           // can be used by the writer.

  // Error code for the latest error encountered during encoding
  WebPEncodingError error_code;
};

Bu yapı, aynı zamanda sıkıştırılmış baytları yayımlayan bir kullanılabilir hale getirir. Bellek içi yazıcı ile ilgili aşağıdaki örneğe bakın. Diğer yazarlar verileri doğrudan bir dosyaya depolayabilir (bkz. examples/cwebp.c) bakın.

Gelişmiş API'yı kullanarak kodlamaya ilişkin genel akış aşağıdaki gibidir: takip etmek için:

Öncelikle, mevcut JavaScript'i içeren bir kodlama yapılandırması parametreleridir. Aynı yapılandırmanın kullanılabileceğini unutmayın sonradan birkaç farklı resmi sıkıştırmak için kullanılır.

#include "webp/encode.h"

WebPConfig config;
if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor)) return 0;   // version error

// Add additional tuning:
config.sns_strength = 90;
config.filter_sharpness = 6;
config.alpha_quality = 90;
config_error = WebPValidateConfig(&config);  // will verify parameter ranges (always a good habit)

Ardından, giriş örneklerinin bir WebPPicture içinde veya referans veya kopyadır. Aşağıda tamponu bekletme süresi için örnekler. Ancak kullanıcılar kolayca bir "görünüm" oluşturabilir daha önce tahsis edilmiş bir örnek dizisidir. WebPPictureView() işlevini inceleyin.

// Setup the input data, allocating a picture of width x height dimension
WebPPicture pic;
if (!WebPPictureInit(&pic)) return 0;  // version error
pic.width = width;
pic.height = height;
if (!WebPPictureAlloc(&pic)) return 0;   // memory error

// At this point, 'pic' has been initialized as a container, and can receive the YUVA or RGBA samples.
// Alternatively, one could use ready-made import functions like WebPPictureImportRGBA(), which will take
// care of memory allocation. In any case, past this point, one will have to call WebPPictureFree(&pic)
// to reclaim allocated memory.

Sıkıştırılmış baytları yayınlamak için yeni baytlar her alındığında bir kanca çağrılır kullanılabilir. Burada, webp/encode.h Bu başlatma işlemi muhtemelen sıkıştırılacak her resim:

// Set up a byte-writing method (write-to-memory, in this case):
WebPMemoryWriter writer;
WebPMemoryWriterInit(&writer);
pic.writer = WebPMemoryWrite;
pic.custom_ptr = &writer;

Artık giriş örneklerini sıkıştırmaya (ve hafızayı boşaltmaya) hazırız:

int ok = WebPEncode(&config, &pic);
WebPPictureFree(&pic);   // Always free the memory associated with the input.
if (!ok) {
  printf("Encoding error: %d\n", pic.error_code);
} else {
  printf("Output size: %d\n", writer.size);
}

API'nin ve yapının daha gelişmiş kullanımı için webp/encode.h başlığında bulunan dokümanlara bakın. Örnek kodu examples/cwebp.c okumak faydalı olabilir daha az kullanılan parametreleri keşfetmenizi sağlar.