WebP API Belgeleri

Bu bölümde, WebP kitaplığında bulunan kodlayıcı ve kod çözücü için API açıklanmaktadır. Bu API açıklaması 1.3.2 sürümüne aittir.

Başlıklar ve Kitaplıklar

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

decode.h
encode.h
types.h

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

Simple Decoding API'si

Kod çözme API'sini kullanmaya başlamak için kitaplık ve başlık dosyalarının yukarıda açıklandığı gibi yüklendiğinden emin olmanız gerekir.

Kod çözme API üstbilgisini 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 ve yüksekliğini alır. Alakasız olduğu kabul edilirse *width ve *height işaretçileri NULL iletilebilir.

Giriş Özellikleri

veri
İşaretçi WebP resim verilerine gitme
data_size
Bu, resim verilerini içeren data tarafından işaret edilen bellek bloğunun boyutudur.

İlerlemeler

false
(a) Biçimlendirme hatası 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. Aralık 1 ile 16383 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çi WebP resim verilerine gitme
data_size
Bu, resim verilerini içeren data tarafından işaret edilen bellek bloğunun boyutudur.

İlerlemeler

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

Diğer durumlarda ek VP8StatusCode hata değerleri.

özellikler
WebPBitstreamFeatures yapısının işaretçisi.
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 tarafından işaret edilen bir WebP resminin kodunu çözer.

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

Bu işlevlerden herhangi birini çağıran kod, bu işlevlerin WebPFree() ile döndürülen (uint8_t*) veri arabelleğini silmelidir.

Giriş Özellikleri

veri
İşaretçi WebP resim verilerine gitme
data_size
Bu, resim verilerini içeren data tarafından işaret edilen bellek bloğunun boyutudur
genişlik
Tam sayı değeri. Aralık şu anda 1 ile 16383 arasında sınırlıdır.
yükseklik
Tam sayı değeri. Aralık şu anda 1 ile 16383 arasında sınırlıdır.

İlerlemeler

uint8_t*
Sırasıyla doğrusal RGBA/ARGB/BGRA/RGB/BGR sırasında, kodu çözülmüş WebP resim örneklerine giden işaretçi.
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 önceden ayrılmış bir arabelleğe output_buffer çözer. Bu arabellekteki maksimum depolama alanı output_buffer_size ile gösterilir. Bu depolama alanı yeterli değilse (veya bir hata oluştuysa) NULL döndürülür. Aksi takdirde, output_buffer kolaylık olması amacıyla döndürülür.

output_stride parametresi, tarama çizgileri arasındaki mesafeyi (bayt cinsinden) belirtir. Bu nedenle, output_buffer_size değerinin en az output_stride * picture - height olması beklenir.

Giriş Özellikleri

veri
İşaretçi WebP resim verilerine gitme
data_size
Bu, resim verilerini içeren data tarafından işaret edilen bellek bloğunun boyutudur
output_buffer_size
Tam sayı değeri. Ayrılan arabelleğin boyutu
output_stride
Tam sayı değeri. Tarama çizgileri arasındaki mesafeyi belirtir.

İlerlemeler

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, cep telefonları gibi bellek kısıtlaması olan ortamlarda anında kırpma ve ölçeklendirme olanağı sağlayan gelişmiş bir API'yi destekler. Temel olarak bellek kullanımı, yalnızca hızlı bir önizlemeye ihtiyaç duyulduğunda veya çok büyük bir resmin bir kısmının yakınlaştırılması gerektiğinde girişle değil, çıkışın boyutuna göre ölçeklenir. Rastgele bir şekilde bazı CPU'lar da kaydedilebilir.

WebP kod çözme, tam resim kod çözme ve küçük giriş arabellekleri üzerinden artımlı kod çözme olmak üzere iki varyantla sunulur. Kullanıcılar isteğe bağlı olarak resmin kodunu çözmek için harici bir bellek arabelleği sağlayabilir. Aşağıdaki kod örneği, gelişmiş kod çözme API'sini kullanma adımlarından geçer.

Öncelikle bir yapılandırma nesnesini başlatmamı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 yapısı içinde toplanır:

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 önceden bilmemiz gerekirse config.input içinde okunabilir. Örneğin, resimde saydamlık olup olmadığını bilmeniz faydalı olur. Bunun aynı zamanda bit akışının başlığını ayrıştıracağını ve dolayısıyla, bit akışının geçerli bir WebP gibi görünüp görünmediğini anlamanın iyi bir yolu olduğunu unutmayın.

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

Ayırma işlemi için kod çözücüye güvenmek yerine, doğrudan tedarik etmek istememiz ihtimaline karşı kod çözme belleği arabelleğini kurmamız gerekir. Yalnızca belleğe işaret edenin yanı sıra arabelleğin toplam boyutunu ve çizgi adımını (tarama çizgileri arasındaki bayt cinsinden mesafe) sağlamanız yeterlidir.

// 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. Resmin kodunu çözmek için iki olası varyant vardır. Şunları kullanarak resmin kodunu tek seferde çözebiliriz:

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

Alternatif olarak, yeni baytlar kullanılabilir hale geldikçe resmin kodunu kademeli olarak çözmek için artımlı yöntemi kullanabiliriz:

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.output'dadır (veya bu örnekte, istenen çıkış renk alanı MODE_BGRA olduğu için config.output.u.RGBA'da). Resim kaydedilebilir, görüntülenebilir veya başka bir şekilde işlenebilir. Ardından, yalnızca yapılandırmanın nesnesinde ayrılan belleği geri almamız gerekir. Bellek harici olsa ve WebPDecode() tarafından ayrılmamış olsa bile bu işlevi çağırmak güvenlidir:

WebPFreeDecBuffer(&config.output);

Bu API ile resmin kodu, sırasıyla MODE_YUV ve MODE_YUVA kullanılarak YUV ve YUVA biçimlerine çözülebilir. Bu biçim Y'CbCr olarak da adlandırılır.

Basit Kodlama API'sı

En yaygın düzenlerde, RGBA örneklerinin kodlama dizileri için çok basit bazı işlevler sunulmaktadır. Bunlar webp/encode.h başlığında şu şekilde belirtilir:

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 ve sıkıştırma sırasında kaybı ve kaliteyi kontrol eder. 0 değeri, düşük kaliteli ve küçük çıktı boyutlarına karşılık gelir. 100 ise en yüksek kalite ve en büyük çıkış boyutunu ifade eder. İşlem başarılı olduğunda, sıkıştırılmış baytlar *output işaretçisine yerleştirilir ve bayt cinsinden boyut döndürülür (aksi takdirde, hata durumunda 0 döndürülür). Arayanın, belleği geri kazanmak için *output işaretçisinde WebPFree() araması yapması gerekir.

Giriş dizisi, işlevin adı tarafından beklendiği gibi, paketlenmiş bir bayt dizisi (her kanal için bir adet) olmalıdır. stride, bir satırdan diğerine atlamak için gereken bayt sayısına karşılık gelir. Ö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. Kayıpsız özellikte bu, "tam" özelliğinin devre dışı bırakıldığı anlamına gelir. Şeffaf alanlardaki RGB değerleri, sıkıştırmayı iyileştirmek için değiştirilir. Bunu önlemek için WebPEncode() özelliğini kullanıp WebPConfig::exact öğesini 1 olarak ayarlayın.

Gelişmiş Kodlama API'sı

Gelişmiş kodlayıcıda birçok gelişmiş kodlama parametresi bulunur. Sıkıştırma verimliliği ile işleme süresi arasındaki dengeyi daha iyi dengelemek için yararlı olabilirler. 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 cwebp komut satırı aracı kullanılarak deneme amacıyla erişilebildiğini unutmayın.

Giriş örnekleri bir WebPPicture yapısı içine yerleştirilmelidir. Bu yapı, use_argb işaretinin değerine bağlı olarak giriş örneklerini RGBA veya YUVA biçiminde depolayabilir.

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ının, sıkıştırılmış baytları kullanıma sunulduklarında yayınlama işlevi de vardır. Bellek içi yazıcıyla ilgili bir örneği aşağıda görebilirsiniz. Diğer yazarlar, verileri doğrudan bir dosyaya depolayabilir (böyle bir örnek için examples/cwebp.c sayfasına bakın).

Gelişmiş API'yi kullanarak kodlamaya ilişkin genel akış aşağıdaki gibidir:

Öncelikle, sıkıştırma parametrelerini içeren bir kodlama yapılandırması oluşturmamız gerekir. Daha sonra birkaç farklı görüntüyü sıkıştırmak için aynı yapılandırmanın kullanılabileceğini unutmayın.

#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 referans veya kopya yoluyla bir WebPPicture öğesine referans verilmesi gerekir. Tamponu örnekleri tutmak için nasıl ayıracağınıza dair bir örneği aşağıda bulabilirsiniz. Ancak önceden ayrılmış bir örnek diziye kolayca "görünüm" oluşturulabilir. 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ı yaymak için yeni baytlar her mevcut olduğunda bir kanca çağrılır. webp/encode.h öğesinde tanımlanan bellek yazarıyla ilgili basit bir örneği burada bulabilirsiniz. Her resmin sıkıştırılması için bu başlatma işlemi gerekebilir:

// 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 daha sonra belleklerini 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 yer alan belgelere bakmanız önerilir. examples/cwebp.c örnek kodunu okumak, daha az kullanılan parametreleri keşfetmek için faydalı olabilir.