Bu bölümde, WebP kitaplığına dahil edilen kodlayıcı ve kod çözücü API'si açıklanmaktadır. Bu API açıklaması 1.5.0 sürümüyle ilgilidir.
Üstbilgiler ve Kitaplıklar
libwebp
'yi yüklediğinizde, platformunuzun tipik konumuna webp/
adlı bir dizin yüklenir. Örneğin, Unix platformlarında aşağıdaki üstbilgi dosyaları /usr/local/include/webp/
'e 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/
içindedir.
Simple Decoding API
Kod çözme API'sini kullanmaya başlamak için kitaplığı ve başlık dosyalarını yukarıda açıklandığı şekilde yüklediğinizden 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 üstbilgisini doğrular ve resim genişliğini ve yüksekliğini alır. Alakalı olmadığı düşünülen *width
ve *height
işaretçileri NULL
ile iletilebilir.
Giriş Özellikleri
- veri
- WebP resim verilerine işaretçi
- data_size
- Bu,
data
tarafından işaretlenen ve görüntü verilerini içeren bellek bloğunun boyutudur.
İadeler
- yanlış
- Biçimlendirme hatası (hataları) durumunda döndürülen hata kodu.
- true
- Başarılı olursa.
*width
ve*height
yalnızca başarılı bir iade işleminde geçerlidir. - genişlik
- Tam sayı değeri. Aralık 1 ile 16.383 arasındadır.
- yükseklik
- Tam sayı değeri. Aralık 1 ile 16.383 arasındadı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ışından özellikleri alır. *features
yapısı, bit akışından toplanan bilgilerle doldurulur:
Giriş Özellikleri
- veri
- WebP resim verilerine işaretçi
- data_size
- Bu,
data
tarafından işaretlenen ve görüntü verilerini içeren bellek bloğunun boyutudur.
İadeler
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ı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
tarafından işaretlenen bir WebP resminin kodunu çözer.
WebPDecodeRGBA
, RGBA resim örneklerini[r0, g0, b0, a0, r1, g1, b1, a1, ...]
sırasına göre döndürür.WebPDecodeARGB
, ARGB resim örneklerini[a0, r0, g0, b0, a1, r1, g1, b1, ...]
sırasına göre döndürür.WebPDecodeBGRA
, BGRA resim örneklerini[b0, g0, r0, a0, b1, g1, r1, a1, ...]
sırasına göre döndürür.WebPDecodeRGB
, RGB resim örneklerini[r0, g0, b0, r1, g1, b1, ...]
sırasına göre döndürür.WebPDecodeBGR
, BGR resim örneklerini[b0, g0, r0, b1, g1, r1, ...]
sırasına göre döndürür.
Bu işlevlerden herhangi birini çağıran kod, bu işlevler tarafından döndürülen veri arabelleğini WebPFree()
ile silmelidir.(uint8_t*)
Giriş Özellikleri
- veri
- WebP resim verilerine işaretçi
- data_size
- Bu,
data
tarafından işaretlenen ve görüntü verilerini içeren bellek bloğunun boyutudur - genişlik
- Tam sayı değeri. Aralık şu anda 1 ile 16.383 arasında sınırlıdır.
- yükseklik
- Tam sayı değeri. Aralık şu anda 1 ile 16.383 arasında sınırlıdır.
İadeler
- uint8_t*
- Sırasıyla doğrusal RGBA/ARGB/BGRA/RGB/BGR sırasına göre kod çözülmüş WebP resim örneklerinin işaretçisi.
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
dönüştürür. Bu arabellekte kullanılabilen 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 ç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
- WebP resim verilerine işaretçi
- data_size
data
tarafından işaretlenen 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
- Kodunun çözüldüğü WebP resminin işaretçisi.
- uint8_t* İşlev başarılıysa
output_buffer
, aksi takdirdeNULL
değerini döndürür.
Gelişmiş Kod Çözme API'si
WebP kod çözme, anında kırpma ve yeniden ölçeklendirme özelliği sunmak için gelişmiş bir API'yi destekler. Bu özellik, mobil telefonlar gibi bellek kısıtlaması olan ortamlarda çok kullanışlıdır. Temel olarak, kullanıcının yalnızca hızlı bir önizlemeye veya çok büyük bir resmin yakınlaştırılmış bir bölümüne ihtiyacı olduğunda bellek kullanımı, girişin değil çıkışın boyutuna göre ölçeklenir. Bu arada, biraz da CPU tasarrufu yapabilirsiniz.
WebP kod çözme işlemi, tam resim kod çözme ve küçük giriş arabelleklerinde artımlı kod çözme olmak üzere iki varyantta 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ğ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ında 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 gerekmesi durumunda config.input
içine okunabilir. Örneğin, resmin şeffaf olup olmadığını bilmek yararlı 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 bit akışı olup olmadığını öğrenmenin iyi bir yolu olduğunu unutmayın.
CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
Ardından, kod çözme bellek arabelleğini, kod çözücüye ayırma işlemini bırakmak yerine doğrudan sağlamak istediğimiz durumlarda ayarlamamız gerekir. Yalnızca belleğe işaretçiyi, arabelleğin toplam boyutunu ve satır adımını (tarama çizgileri arasındaki bayt cinsinden mesafe) sağlamamız gerekir.
// 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, kodun çözülmesine hazırdır. Resmin kodunu çözmek için iki olası varyant vardır. Aşağıdakileri 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üş resim artık config.output içindedir (veya istenen çıkış renk alanı MODE_BGRA olduğu için bu durumda config.output.u.RGBA içindedir). Resim kaydedilebilir, görüntülenebilir veya başka şekilde işlenebilir. Ardından, config nesnesinde ayrılan belleği geri almamız yeterlidir. 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 görüntünün kodu, sırasıyla MODE_YUV
ve MODE_YUVA
kullanılarak YUV ve YUVA biçimlerine de çözülebilir. Bu biçime Y'CbCr da denir.
Simple Encoding API
En yaygın düzenlerde RGBA örnek dizilerini kodlamak için bazı çok basit işlevler sağlanır. Bunlar webp/encode.h
üstbilgisinde şu şekilde tanımlanır:
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ındaki kaybı ve kaliteyi kontrol eder. 0 değeri düşük kalite ve küçük çıkış boyutlarına, 100 ise en yüksek kalite 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 (başarısız olursa 0 döndürülür). Arayan, belleği geri almak için *output
işaretçisinde WebPFree()
işlevini çağırmalıdır.
Giriş dizisi, sıkıştırılmış bir bayt dizisi olmalıdır (işlevin adından da anlaşılacağı gibi, her kanal için bir tane). stride
, bir satırdan diğerine atlamak için gereken bayt sayısına karşılık gelir. Örneğin, BGRA düzeni şu şekildedir:
Kaybetsiz 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ümler gibi kitaplığın varsayılan ayarlarını kullandığını unutmayın. Bu, kayıpsız için "tam" değerinin devre dışı bırakıldığı anlamına gelir. Şeffaf alanların 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ı, birçok gelişmiş kodlama parametresi içerir.
Sıkıştırma verimliliği ile işleme süresi arasındaki dengeyi daha iyi ayarlamak için bu parametreler yararlı olabilir.
Bu parametreler WebPConfig
yapısında 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ını kullanarak deneme amacıyla erişilebileceğini unutmayın.
Giriş örnekleri bir WebPPicture
yapısına sarmalanmış olmalı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ü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ıda, sıkıştırılmış baytlar kullanıma sunulduğunda bunları yayınlayan bir işlev de vardır. Bellek içi bir yazar içeren bir örnek için aşağıya bakın.
Diğer yazarlar verileri doğrudan bir dosyada saklayabilir (bu tür bir örnek için examples/cwebp.c
bölümüne bakın).
Gelişmiş API'yi kullanarak kodlama işleminin 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 birkaç farklı resmi 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 referans veya kopyalama yoluyla bir WebPPicture
'e referans vermesi gerekir. Aşağıda, örnekleri tutmak için arabellek ayıran bir örnek verilmiştir. Ancak, önceden ayrılmış bir örnek dizisine kolayca "görüntüleme" ayarlayabilirsiniz. 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ı yayınlamak için yeni baytlar her kullanılabilir hâle geldiğinde bir kanca çağrılır. Aşağıda, webp/encode.h
içinde memory-writer sınıfının tanımlandığı basit bir örnek verilmiştir. Her resmin sıkıştırılması için bu ilklendirmenin yapılması 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 serbest bırakmaya) 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'yi ve yapıyı daha gelişmiş şekilde kullanmak için webp/encode.h
başlığındaki dokümanları incelemeniz önerilir.
Daha az kullanılan parametreleri keşfetmek için examples/cwebp.c
örnek kodunu okumak faydalı olabilir.