Создать палитру CGImageRef
Я пытаюсь создать палитру (индексированный) PNG с использованием CoreGraphics.
Лучшее, что я нашел, это то, что я могу использовать:
CGColorSpaceRef colorSpace = CGColorSpaceCreateIndexed(CGImageGetColorSpace(maskedImage), 255, <#const unsigned char *colorTable#>);
Затем:
CGImageRef palettedImage = CGImageCreateCopyWithColorSpace(maskedImage, colorSpace)
Однако я не уверен, что поставить в качестве colorTable. Я хотел бы использовать некоторый заранее сделанный (быстрый) алгоритм квантования - такой как тот, который уже встроен в ImageIO при вызове CGImageDestinationCreateWithURL(url, kUTTypeGIF , 1, NULL);
Как мне создать палитру для PNG?
2 ответа
Таким образом, окончательное решение было сделать что-то вроде этого:
// Create an 8-bit palette for the bitmap via libimagequant (http://pngquant.org/lib)
liq_attr *liqAttr = liq_attr_create();
liq_image *liqImage = liq_image_create_rgba(liqAttr, bitmap, (int)width, (int)height, 0);
liq_result *liqRes = liq_quantize_image(liqAttr, liqImage);
liq_write_remapped_image(liqRes, liqImage, bitmap, bytesPerRow * height);
const liq_palette *liqPal = liq_get_palette(liqRes);
// Transpose the result into an rgba array
unsigned char colorTable[1024];
for (NSInteger n = 0; n < liqPal->count; n++) {
colorTable[4 * n] = liqPal->entries[n].r;
colorTable[4 * n + 1] = liqPal->entries[n].g;
colorTable[4 * n + 2] = liqPal->entries[n].b;
colorTable[4 * n + 3] = liqPal->entries[n].a;
}
// Release
liq_attr_destroy(liqAttr);
liq_image_destroy(liqImage);
liq_result_destroy(liqRes);
Я надеялся использовать таблицу цветов для создания CGContextRef. Однако, согласно этой статье: http://developer.apple.com/library/mac/, это невозможно в любом случае.
Если ваше цветовое пространство, например, RGB, вы должны установить colorTable следующим образом:
{R, G, B, R, G, B, R, G, B, ...}