Pillow
133 строки · 3.1 Кб
1/*
2* The Python Imaging Library
3* $Id$
4*
5* quantization using libimagequant, a part of pngquant.
6*
7* Copyright (c) 2016 Marcin Kurczewski <rr-@sakuya.pl>
8*
9*/
10
11#include <stdio.h>12#include <stdlib.h>13#include <string.h>14
15#include "QuantPngQuant.h"16
17#ifdef HAVE_LIBIMAGEQUANT18#include "libimagequant.h"19
20int
21quantize_pngquant(22Pixel *pixelData,23unsigned int width,24unsigned int height,25uint32_t quantPixels,26Pixel **palette,27uint32_t *paletteLength,28uint32_t **quantizedPixels,29int withAlpha30) {31int result = 0;32liq_image *image = NULL;33liq_attr *attr = NULL;34liq_result *remap = NULL;35unsigned char *charMatrix = NULL;36unsigned char **charMatrixRows = NULL;37unsigned int i, y;38*palette = NULL;39*paletteLength = 0;40*quantizedPixels = NULL;41
42/* configure pngquant */43attr = liq_attr_create();44if (!attr) {45goto err;46}47if (quantPixels) {48liq_set_max_colors(attr, quantPixels);49}50
51/* prepare input image */52image = liq_image_create_rgba(attr, pixelData, width, height, 0.45455 /* gamma */);53if (!image) {54goto err;55}56
57/* quantize the image */58remap = liq_quantize_image(attr, image);59if (!remap) {60goto err;61}62liq_set_output_gamma(remap, 0.45455);63liq_set_dithering_level(remap, 1);64
65/* write output palette */66const liq_palette *l_palette = liq_get_palette(remap);67*paletteLength = l_palette->count;68*palette = malloc(sizeof(Pixel) * l_palette->count);69if (!*palette) {70goto err;71}72for (i = 0; i < l_palette->count; i++) {73(*palette)[i].c.b = l_palette->entries[i].b;74(*palette)[i].c.g = l_palette->entries[i].g;75(*palette)[i].c.r = l_palette->entries[i].r;76(*palette)[i].c.a = l_palette->entries[i].a;77}78
79/* write output pixels (pngquant uses char array) */80charMatrix = malloc(width * height);81if (!charMatrix) {82goto err;83}84charMatrixRows = malloc(height * sizeof(unsigned char *));85if (!charMatrixRows) {86goto err;87}88for (y = 0; y < height; y++) {89charMatrixRows[y] = &charMatrix[y * width];90}91if (LIQ_OK != liq_write_remapped_image_rows(remap, image, charMatrixRows)) {92goto err;93}94
95/* transcribe output pixels (pillow uses uint32_t array) */96*quantizedPixels = malloc(sizeof(uint32_t) * width * height);97if (!*quantizedPixels) {98goto err;99}100for (i = 0; i < width * height; i++) {101(*quantizedPixels)[i] = charMatrix[i];102}103
104result = 1;105
106err:107if (attr) {108liq_attr_destroy(attr);109}110if (image) {111liq_image_destroy(image);112}113if (remap) {114liq_result_destroy(remap);115}116free(charMatrix);117free(charMatrixRows);118if (!result) {119free(*quantizedPixels);120free(*palette);121}122return result;123}
124
125const char *126ImagingImageQuantVersion(void) {127static char version[20];128int number = liq_version();129sprintf(version, "%d.%d.%d", number / 10000, (number / 100) % 100, number % 100);130return version;131}
132
133#endif134