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.6.0 sürümüyle ilgilidir.
Başlıklar ve Kitaplıklar
libwebp
kurduğunuzda, platformunuzun normal konumuna webp/
adlı bir dizin yüklenir. Örneğin, Unix platformlarında aşağıdaki üstbilgi dosyaları /usr/local/include/webp/
konumuna 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/
konumundadır.
Simple Decoding API
Kod çözme API'sini kullanmaya başlamak için yukarıda açıklandığı gibi kitaplık ve başlık dosyalarının yüklendiğinden emin olmanız gerekir.
C/C++ kodunuza kod çözme API üstbilgisini aşağıdaki şekilde 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 ile yüksekliğini alır. *width
ve *height
işaretçileri, alakasız olduğu düşünülürse NULL
olarak iletilebilir.
Giriş Özellikleri
- aktarma
- WebP resim verilerine yönelik işaretçi
- data_size
- Bu,
data
tarafından işaret edilen ve resim verilerini içeren bellek bloğunun boyutudur.
İadeler
- yanlış
- Biçimlendirme hatası durumunda döndürülen hata kodu.
- doğru
- Başarılı olursa.
*width
ve*height
yalnızca başarılı iade işlemlerinde geçerlidir. - genişlik
- Tam sayı değeri. Aralık 1 ile 16383 arasında değişir.
- yükseklik
- Tam sayı değeri. Bu aralık 1 ile 16383 arasında bir değerle 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, bit akışındaki özellikleri alır. *features
yapısı, bit akışından toplanan bilgilerle doldurulur:
Giriş Özellikleri
- aktarma
- WebP resim verilerine yönelik işaretçi
- data_size
- Bu,
data
tarafından işaret edilen ve resim verilerini içeren bellek bloğunun boyutudur.
İadeler
VP8_STATUS_OK
- Özellikler başarıyla alındığında.
VP8_STATUS_NOT_ENOUGH_DATA
- Başlıklardaki özelliklerin alınması için daha fazla veri gerektiğinde.
Diğer durumlarda ek VP8StatusCode
hata değerleri.
- özellikler
- WebPBitstreamFeatures yapısına işaretçi.
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 belirtilen bir WebP resminin kodunu çözer.
WebPDecodeRGBA
,[r0, g0, b0, a0, r1, g1, b1, a1, ...]
sırasına göre RGBA görüntü örnekleri döndürür.WebPDecodeARGB
,[a0, r0, g0, b0, a1, r1, g1, b1, ...]
sırasıyla ARGB görüntü örnekleri döndürür.WebPDecodeBGRA
,[b0, g0, r0, a0, b1, g1, r1, a1, ...]
sırasındaki BGRA görüntü örneklerini döndürür.WebPDecodeRGB
,[r0, g0, b0, r1, g1, b1, ...]
sırasıyla RGB görüntü örnekleri döndürür.WebPDecodeBGR
,[b0, g0, r0, b1, g1, r1, ...]
sırasıyla BGR görüntü örnekleri döndürür.
Bu işlevlerden herhangi birini çağıran kod, bu işlevler tarafından döndürülen veri arabelleğini (uint8_t*)
ile silmelidir.WebPFree()
Giriş Özellikleri
- aktarma
- WebP resim verilerine yönelik işaretçi
- data_size
- Bu,
data
tarafından işaret edilen ve görüntü verilerini içeren bellek bloğunun boyutudur.
- genişlik
- Tam sayı değeri. Şu anda aralık 1 ile 16383 arasında sınırlıdır.
- yükseklik
- Tam sayı değeri. Şu anda aralık 1 ila 16383 ile sınırlıdır.
İadeler
- uint8_t*
- Sırasıyla doğrusal RGBA/ARGB/BGRA/RGB/BGR düzeninde kod çözümü yapılmış WebP resim örneklerine yönelik 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 görüntüyü doğrudan önceden ayrılmış bir arabelleğe output_buffer
kodunu çözerek aktarır. 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, kolaylık sağlamak için output_buffer
döndürülür.
output_stride
parametresi, tarama satırları arasındaki mesafeyi (bayt cinsinden) belirtir. Bu nedenle, output_buffer_size
değerinin en az output_stride * picture - height
olması beklenir.
Giriş Özellikleri
- aktarma
- WebP resim verilerine yönelik işaretçi
- data_size
- Bu,
data
tarafından işaret edilen ve görüntü verilerini içeren 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.
İadeler
- output_buffer
- Kod çözümü yapılmış WebP resmine yönelik işaretçi.
- uint8_t* İşlev başarılı olursa
output_buffer
, aksi takdirdeNULL
.
Advanced Decoding API
WebP kod çözme, anında kırpma ve yeniden ölçeklendirme olanağı sağlayan gelişmiş bir API'yi destekler. Bu özellik, cep telefonları gibi bellek kısıtlaması olan ortamlarda çok faydalıdır. Temel olarak, bellek kullanımı girişin değil, çıkışın boyutuyla ölçeklenir. Bu, yalnızca hızlı bir önizlemeye veya aksi takdirde çok büyük olan bir resmin yakınlaştırılmış bir bölümüne ihtiyaç duyulduğunda geçerlidir. Bu sayede biraz CPU da tasarruf edebilirsiniz.
WebP kod çözme işlemi iki varyantta yapılır: tam görüntü kod çözme ve küçük giriş arabellekleri üzerinden artımlı kod çözme. Kullanıcılar, isteğe bağlı olarak görüntünün kodunu çözmek için harici bir bellek arabelleği sağlayabilir. Aşağıdaki kod örneğinde, gelişmiş kod çözme API'sinin kullanım adımları açıklanmaktadır.
Öncelikle bir yapılandırma nesnesi 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 gerektiğinde config.input
içine okunabilir. Örneğin, resimde şeffaflık olup olmadığını bilmek faydalı olabilir. Bu işlemin, bit akışının başlığını da ayrıştıracağını ve bu nedenle bit akışının geçerli bir WebP dosyası gibi görünüp görünmediğini anlamak için iyi bir yöntem olduğunu unutmayın.
CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
Ardından, ayrılması için kod çözücüye güvenmek yerine doğrudan sağlamak istiyorsak kod çözme bellek arabelleğini ayarlamamız gerekir. Belleğe yönelik işaretçinin yanı sıra arabelleğin toplam boyutunu ve satır aralığını (tarama satırları arasındaki bayt cinsinden mesafe) sağlamamı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;
Resim kod çözmeye hazır. Resmi çözmek için iki olası varyant vardır. Aşağıdakileri kullanarak resmi tek seferde çözebiliriz:
CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
Alternatif olarak, yeni baytlar kullanılabilir hale geldikçe görüntüyü 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.
Kod çözme işlemi yapılan resim artık config.output'ta (veya bu durumda, istenen çıkış renk alanı MODE_BGRA olduğundan config.output.u.RGBA'da) yer alıyor. Resim kaydedilebilir, gösterilebilir veya başka şekilde işlenebilir. Ardından, yalnızca yapılandırma 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 kullanılarak resim, sırasıyla MODE_YUV
ve MODE_YUVA
kullanılarak YUV ve YUVA biçimlerine de kod çözülebilir. Bu biçime Y'CbCr de denir.
Simple Encoding API
En yaygın düzenlerdeki RGBA örnek dizilerini kodlamak için bazı çok basit işlevler sağlanır. Bunlar webp/encode.h
üstbilgisinde ş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 kaliteye ve küçük çıkış boyutlarına karşılık gelirken 100 değeri en yüksek kaliteye ve en büyük çıkış boyutuna karşılık gelir.
İşlem başarılı olursa sıkıştırılmış baytlar *output
işaretçisine yerleştirilir ve bayt cinsinden boyut döndürülür (aksi takdirde, işlem başarısız olursa 0 döndürülür). Arayan kişi, belleği geri almak için *output
işaretçisinde WebPFree()
numarasını aramalıdır.
Giriş dizisi, baytların paketlenmiş bir dizisi olmalıdır (işlevin adının da belirttiği gibi, her kanal için bir bayt). stride
, bir satırdan diğerine geçmek için gereken bayt sayısını gösterir. Örneğin, BGRA düzeni:
Kayıpsız kodlama için imzalı 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);
Bu işlevlerin, kayıplı sürümlerde olduğu gibi kitaplığın varsayılan ayarlarını kullandığını unutmayın. Kayıpsız için bu, "tam"ın 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()
kullanın ve WebPConfig::exact
değerini 1
olarak ayarlayın.
Advanced Encoding API
Kodlayıcı, arka planda çok sayıda gelişmiş kodlama parametresiyle birlikte gelir.
Sıkıştırma verimliliği ve işleme süresi arasındaki dengeyi daha iyi sağlamak 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ğunun, cwebp
komut satırı aracı kullanılarak deneme için erişilebilir olduğunu unutmayın.
Giriş örnekleri, WebPPicture
yapısına sarılmalıdır.
Bu yapı, use_argb
işaretinin değerine bağlı olarak giriş örneklerini RGBA veya YUVA biçiminde saklayabilir.
Yapı şu şekilde düzenlenir:
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ıda, sıkıştırılmış baytları kullanıma sunuldukları anda yayınlama işlevi de bulunur. Bellek içi yazıcı örneğini aşağıda bulabilirsiniz.
Diğer yazarlar, verileri doğrudan bir dosyada saklayabilir (Böyle bir örnek için examples/cwebp.c
bölümüne bakın).
Gelişmiş API kullanılarak yapılan kodlamanın genel akışı aşağıdaki gibidir:
Öncelikle, sıkıştırma parametrelerini içeren bir kodlama yapılandırması oluşturmamız gerekir. Aynı yapılandırmanın daha sonra farklı resimleri sıkıştırmak için 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 WebPPicture
içinde referans veya kopya olarak belirtilmesi gerekir. Aşağıda, örnekleri tutmak için arabellek ayırma örneği verilmiştir. Ancak, önceden ayrılmış bir örnek dizide kolayca "görünüm" oluşturulabilir. WebPPictureView()
işlevine bakın.
// 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 kullanıma sunulduğunda her seferinde bir kanca çağrılır. Aşağıda, webp/encode.h
içinde bellek yazıcısının tanımlandığı basit bir örnek verilmiştir. Bu ilk kullanıma hazırlama işlemi, sıkıştırılacak her resim için muhtemelen gereklidir:
// 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 ardından 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 bulunan dokümanlara göz atmanız önerilir.
Örnek kodu examples/cwebp.c
okumak, daha az kullanılan parametreleri keşfetmek için faydalı olabilir.