我正在尝试使用CoreGraphics创建一个调色板(索引)PNG。
我发现的最好的是我可以使用:
CGColorSpaceRef colorSpace = CGColorSpaceCreateIndexed(CGImageGetColorSpace(maskedImage), 255, <#const unsigned char *colorTable#>);
然后:
CGImageRef palettedImage = CGImageCreateCopyWithColorSpace(maskedImage, colorSpace)
但是我不确定将什么作为colorTable。我想利用一些预制(快速)量化算法 - 例如在调用CGImageDestinationCreateWithURL(url, kUTTypeGIF , 1, NULL);
时已经内置到ImageIO中的算法
如何为PNG创建调色板?
答案 0 :(得分:1)
如果您的颜色空间是例如RGB,则可以像这样设置colorTable:
{R, G, B, R, G, B, R, G, B, ...}
答案 1 :(得分:1)
所以最终的解决方案是做这样的事情:
// 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/#qa/qa1037/_index.html在任何情况下都是不可能的。