lib spng ( s imple png ) هي مكتبة C لقراءة وكتابة ملفات بتنسيق Portable Network Graphics (PNG) مع التركيز على الأمان وسهولة الاستخدام.
يعد libspng بديلاً لـ libpng، والمشاريع منفصلة وواجهات برمجة التطبيقات غير متوافقة.
الهدف هو توفير مكتبة PNG سريعة مع واجهة برمجة تطبيقات أبسط من libpng، فهي تتفوق على التنفيذ المرجعي في حالات الاستخدام الشائعة.
ميزة | com.spng | libpng | stb_image | com.lodepng |
---|---|---|---|---|
فك التشفير من الدفق | ✅ | ✅ | ✅ | |
تصحيح جاما | ✅ | ✅ | ||
لا توجد أخطاء أمنية معروفة [1] | ✅ | ✅ | ✅ | |
قراءة الصورة التقدمية | ✅ | ✅ | ||
يوزع جميع القطع القياسية | ✅ | ✅ | ||
لا يتطلب زليب [2] | ✅ | ✅ | ✅ | |
الترميز | ✅ | ✅ | ✅ | ✅ |
الرسوم المتحركة PNG | المخطط لها | ✅ [3] |
[1] تم اختبار المشروع على OSS-Fuzz وتم إصلاح نقاط الضعف قبل أن تصبح عامة.
[2] يتم دعم البناء باستخدام miniz.
[3] مع تصحيح الطرف الثالث
قم بتنزيل أحدث إصدار وقم بتضمين spng.c/spng.h
في مشروعك، ويمكنك أيضًا الإنشاء باستخدام CMake أو Meson، راجع الوثائق للحصول على التفاصيل.
#include <spng.h>/* إنشاء سياق وحدة فك الترميز */spng_ctx *ctx = spng_ctx_new(0);/* تعيين مخزن مؤقت للإدخال */spng_set_png_buffer(ctx, buf, buf_size);/* تحديد حجم الصورة الناتجة */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* فك التشفير إلى RGBA 8 بت */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* ذاكرة السياق المجانية */spng_ctx_free(ctx);/* يتطلب إنشاء سياق برنامج التشفير علامة */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* تشفير إلى المخزن المؤقت الداخلي الذي تديره المكتبة */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* تحديد أبعاد الصورة، تنسيق PNG */struct spng_ihdr ihdr ={ .العرض = العرض، .الارتفاع = الارتفاع، عمق البت = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* سيتم ترميز الصورة وفقًا لـ ihdr.color_type, .bit_عمق */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG هي قيمة خاصة تتطابق مع التنسيق في ihdr، وسيقوم SPNG_ENCODE_FINALIZE بإنهاء ملف PNG باستخدام علامة نهاية الملف */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* تتم كتابة PNG إلى مخزن مؤقت داخلي بشكل افتراضي */void *png = spng_get_png_buffer(enc, &png_size, &error);/* المستخدم يمتلك المخزن المؤقت بعد مكالمة ناجحة */free(png);/* ذاكرة سياق مجانية */spng_ctx_free(enc);
انظر المثال ج.
الكود مرخص بموجب ترخيص BSD المكون من فقرتين "المبسطة".
يحتوي المشروع على تحسينات وصور اختبارية من libpng، وهي مرخصة بموجب ترخيص مكتبة PNG المرجعية الإصدار 2.
تتم كتابة التعليمات البرمجية وفقًا لقواعد معيار الترميز CERT C. يتم التحقق من جميع العمليات الحسابية الصحيحة للتأكد من تجاوز السعة ويتم التعامل مع جميع حالات الخطأ بأمان.
يتم فحص المكتبة بشكل مستمر بواسطة OSS-Fuzz، كما يتم فحص التعليمات البرمجية أيضًا باستخدام Clang Static Analyzer، وCoverity Scan، وPVS-Studio.
تتكون مجموعة الاختبار من أكثر من 1000 حالة اختبار، وتم فك تشفير 175 صورة اختبارية بجميع تنسيقات الإخراج الممكنة ومجموعات العلامات ومقارنتها بـ libpng للتأكد من صحتها.
تتبع الإصدارات نظام الإصدار الدلالي مع ضمانات إضافية:
الإصدارات من 0.4.0 إلى 0.8.x مستقرة
إذا كان الإصدار 1.0.0 سيقدم تغييرات جذرية، فسيتم الاحتفاظ بالإصدار 0.8.x كفرع ثابت منفصل
حاليًا، من المقرر أن يكون الإصدار 1.0.0 متوافقًا.
الوثائق عبر الإنترنت متاحة على libspng.org/docs.
فك التشفير إلى تنسيقات الإخراج SPNG_FMT_G8
و SPNG_FMT_GA8
و SPNG_FMT_GA16
غير مدعوم لجميع مجموعات ألوان PNG وعمق البت، راجع الوثائق للحصول على التفاصيل.
لم يتم تنفيذ تصحيح جاما لتنسيقات الإخراج SPNG_FMT_PNG
و SPNG_FMT_G8
و SPNG_FMT_GA8
و SPNG_FMT_GA16
.
يمكنك رعاية التطوير من خلال OpenCollective، وسيتم استخدام الأموال للصيانة ومواصلة التطوير وفقًا لخارطة الطريق.
ادعم هذا المشروع مع مؤسستك. سيظهر شعارك هنا مع رابط لموقعك على الويب. [يساهم]