lib spng ( s imple png ) เป็นไลบรารี C สำหรับการอ่านและเขียนไฟล์รูปแบบ Portable Network Graphics (PNG) โดยเน้นไปที่ความปลอดภัยและความสะดวกในการใช้งาน
libspng เป็นทางเลือกแทน libpng โปรเจ็กต์แยกจากกันและ API เข้ากันไม่ได้
เป้าหมายคือการจัดเตรียมไลบรารี PNG ที่รวดเร็วด้วย API ที่ง่ายกว่า libpng ซึ่งมีประสิทธิภาพเหนือกว่าการใช้งานอ้างอิงในกรณีการใช้งานทั่วไป
คุณสมบัติ | สปริง | libpng | stb_image | โลเดปง |
---|---|---|---|---|
ถอดรหัสจากสตรีม | ||||
การแก้ไขแกมมา | ||||
ไม่มีจุดบกพร่องด้านความปลอดภัยที่ทราบ [1] | ||||
อ่านภาพแบบก้าวหน้า | ||||
แยกวิเคราะห์ชิ้นมาตรฐานทั้งหมด | ||||
ไม่ต้องใช้ zlib [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);/* ถอดรหัสเป็น 8 บิต RGBA */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 ={ .width = ความกว้าง .height = ความสูง .bit_deep = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* รูปภาพจะถูกเข้ารหัสตาม ihdr.color_type, .bit_deep */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 2 ข้อ
โครงการประกอบด้วยการเพิ่มประสิทธิภาพและภาพทดสอบจาก libpng ซึ่งได้รับอนุญาตภายใต้ PNG Reference Library License เวอร์ชัน 2
รหัสถูกเขียนตามกฎของ CERT C Coding Standard เลขคณิตจำนวนเต็มทั้งหมดได้รับการตรวจสอบสำหรับการโอเวอร์โฟลว์ และเงื่อนไขข้อผิดพลาดทั้งหมดได้รับการจัดการอย่างดี
ไลบรารีถูกคลุมเครืออย่างต่อเนื่องโดย OSS-Fuzz นอกจากนี้ยังมีการสแกนโค้ดด้วย Clang Static Analyzer, Coverity Scan และ PVS-Studio
ชุดการทดสอบประกอบด้วยกรณีทดสอบมากกว่า 1,000 กรณี ภาพทดสอบ 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 โดยเงินทุนจะนำไปใช้ในการบำรุงรักษาและพัฒนาต่อไปตามแผนงาน
สนับสนุนโครงการนี้กับองค์กรของคุณ โลโก้ของคุณจะแสดงที่นี่พร้อมลิงก์ไปยังเว็บไซต์ของคุณ [มีส่วนช่วย]