Need help with svpng?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.
miloyip

Description

Minimalistic C function for saving RGB/RGBA image as uncompressed PNG.

474 Stars 100 Forks BSD 3-Clause "New" or "Revised" License 8 Commits 2 Opened issues

Services available

Need anything else?

svpng v0.1.1

A minimalistic C function for saving RGB/RGBA image into uncompressed PNG.

Copyright (C) 2017 Milo Yip. All rights reserved.

Features

  • RGB or RGBA color format
  • Single function
  • 32 lines of ANSI C code
  • No dependency
  • Customizable output stream (default with C file descriptor)

Usage

By default,

svpng()
function has the following declaration:
/*!
    \brief Save a RGB/RGBA image in PNG format.
    \param out Output stream (by default using file descriptor).
    \param w Width of the image. (<16383)
    \param h Height of the image.
    \param img Image pixel data in 24-bit RGB or 32-bit RGBA format.
    \param alpha Whether the image contains alpha channel.
*/
void svpng(FILE* out, unsigned w, unsigned h, const unsigned char* img, int alpha);

Basically, you

fopen()
a binary file for writing, then call this function with the image data. The pixels are packed linearly from top to bottom, left to right.

For 24-bit RGB format (with

alpha = 0
), the R, G, B components are stored in
img[(y * w + x) * 3]
,
img[(y * w + x) * 3 + 1]
,
img[(y * w + x) * 3 + 2]
respectively.

For 32-bit RGBA format (with

alpha != 0
), the R, G, B, A components are stored in
img[(y * w + x) * 4]
,
img[(y * w + x) * 4 + 1]
,
img[(y * w + x) * 4 + 2]
,
img[(y * w + x) * 4 + 3]
respectively.

Example

example.c saves a RGB and a RGBA PNG.

void test_rgb(void) {
    unsigned char rgb[256 * 256 * 3], *p = rgb;
    unsigned x, y;
    FILE *fp = fopen("rgb.png", "wb");
    for (y = 0; y < 256; y++)
        for (x = 0; x < 256; x++) {
            *p++ = (unsigned char)x;    /* R */
            *p++ = (unsigned char)y;    /* G */
            *p++ = 128;                 /* B */
        }
    svpng(fp, 256, 256, rgb, 0);
    fclose(fp);
}

void test_rgba(void) { unsigned char rgba[256 * 256 * 4], p = rgba; unsigned x, y; FILE fp = fopen("rgba.png", "wb"); for (y = 0; y < 256; y++) for (x = 0; x < 256; x++) { p++ = (unsigned char)x; / R / p++ = (unsigned char)y; / G */ *p++ = 128; / B */ p++ = (unsigned char)((x + y) / 2); / A */ } svpng(fp, 256, 256, rgba, 1); fclose(fp); }

int main(void) { test_rgb(); test_rgba(); return 0; }

Compilation

gcc example.c && ./a.out

Output

rgb.png

rgba.png

Customizability

User can define the following macros before including

svpng.inc
.

| Macro | Default | Description | |-----------------|-----------------|-------------| |

SVPNG_LINKAGE
| (empty) | Linkage of
svpng()
function, e.g.
inline
,
static
,
extern "C"
, etc. | |
SVPNG_OUTPUT
|
FILE* out
| Output stream parameter, e.g.
std::ostream& os
,
std::vector<:uint8_t>& buffer
, etc. | |
SVPNG_PUT(u)
|
fputc(u, out)
| Output a byte into stream, e.g.
os.put(u)
,
buffer.push_back(u)
, etc. |

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.