lib spng ( s simple png ) adalah perpustakaan C untuk membaca dan menulis file berformat Portable Network Graphics (PNG) dengan fokus pada keamanan dan kemudahan penggunaan.
libspng adalah alternatif dari libpng, proyeknya terpisah dan API tidak kompatibel.
Tujuannya adalah untuk menyediakan perpustakaan PNG yang cepat dengan API yang lebih sederhana daripada libpng, yang mengungguli implementasi referensi dalam kasus penggunaan umum.
Fitur | spng | libpng | stb_image | lodepng |
---|---|---|---|---|
Dekode dari aliran | ✅ | ✅ | ✅ | |
Koreksi gamma | ✅ | ✅ | ||
Tidak ada bug keamanan yang diketahui [1] | ✅ | ✅ | ✅ | |
Pembacaan gambar progresif | ✅ | ✅ | ||
Parsing semua potongan standar | ✅ | ✅ | ||
Tidak memerlukan zlib [2] | ✅ | ✅ | ✅ | |
Pengkodean | ✅ | ✅ | ✅ | ✅ |
PNG animasi | Berencana | ✅ [3] |
[1] Proyek ini diuji secara fuzz di OSS-Fuzz dan kerentanan diperbaiki sebelum dipublikasikan.
[2] Membangun dengan miniz didukung.
[3] Dengan patch pihak ketiga
Unduh rilis terbaru dan sertakan spng.c/spng.h
dalam proyek Anda, Anda juga dapat membangun dengan CMake atau Meson, lihat dokumentasi untuk detailnya.
#include <spng.h>/* Membuat konteks decoder */spng_ctx *ctx = spng_ctx_new(0);/* Mengatur buffer input */spng_set_png_buffer(ctx, buf, buf_size);/* Menentukan ukuran gambar keluaran */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* Dekode ke RGBA 8-bit */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* Memori konteks bebas */spng_ctx_free(ctx);/* Membuat konteks encoder memerlukan flag */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Encode ke buffer internal yang dikelola oleh perpustakaan */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Tentukan dimensi gambar, format PNG */struct spng_ihdr ihdr ={ .lebar = lebar, .tinggi = tinggi, .bit_kedalaman = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* Gambar akan dikodekan sesuai dengan ihdr.color_type, .bit_ depth */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG adalah nilai khusus yang cocok dengan format di ihdr, SPNG_ENCODE_FINALIZE akan menyelesaikan PNG dengan penanda akhir file */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG ditulis ke buffer internal secara default */void *png = spng_get_png_buffer(enc, &png_size, &error);/* Pengguna memiliki buffer setelah berhasil panggilan */free(png);/* Memori konteks bebas */spng_ctx_free(enc);
Lihat contoh.c.
Kode dilisensikan di bawah Lisensi "Sederhana" klausa 2 BSD.
Proyek ini berisi pengoptimalan dan pengujian gambar dari libpng, ini dilisensikan di bawah Lisensi Perpustakaan Referensi PNG versi 2.
Kode ditulis sesuai dengan aturan Standar Pengkodean CERT C. Semua aritmatika integer diperiksa apakah ada overflow dan semua kondisi kesalahan ditangani dengan baik.
Perpustakaan terus-menerus dikaburkan oleh OSS-Fuzz, kode juga dipindai dengan Clang Static Analyzer, Coverity Scan, dan PVS-Studio.
Rangkaian pengujian terdiri dari lebih dari 1000 kasus pengujian, 175 gambar pengujian didekodekan dengan semua kemungkinan format keluaran dan kombinasi tanda dan dibandingkan dengan libpng untuk kebenarannya.
Rilis mengikuti skema pembuatan versi semantik dengan jaminan tambahan:
Rilis dari 0.4.0 hingga 0.8.x stabil
Jika 1.0.0 akan memperkenalkan perubahan yang dapat menyebabkan gangguan maka 0.8.x akan dipertahankan sebagai cabang stabil terpisah
Saat ini 1.0.0 direncanakan kompatibel.
Dokumentasi online tersedia di libspng.org/docs.
Decoding ke format output SPNG_FMT_G8
, SPNG_FMT_GA8
dan SPNG_FMT_GA16
tidak didukung untuk semua kombinasi jenis warna dan kedalaman bit PNG, lihat dokumentasi untuk detailnya.
Koreksi gamma tidak diterapkan untuk format keluaran SPNG_FMT_PNG
, SPNG_FMT_G8
, SPNG_FMT_GA8
dan SPNG_FMT_GA16
.
Anda dapat mensponsori pengembangan melalui OpenCollective, dana akan digunakan untuk pemeliharaan dan pengembangan lebih lanjut sesuai peta jalan.
Dukung proyek ini dengan organisasi Anda. Logo Anda akan muncul di sini dengan tautan ke situs web Anda. [Menyumbang]