2013-07-04 101 views
2

我正嘗試使用CoreGraphics創建一個調色板(索引)PNG。創建調色板CGImageRef

我發現最好的是,我可以使用:

CGColorSpaceRef colorSpace = CGColorSpaceCreateIndexed(CGImageGetColorSpace(maskedImage), 255, <#const unsigned char *colorTable#>);

然後:

CGImageRef palettedImage = CGImageCreateCopyWithColorSpace(maskedImage, colorSpace)

但是我不知道該用什麼作爲的colorTable。我想利用一些預先製作的(快速)量化算法 - 例如在調用時已經內置到ImageIO的算法CGImageDestinationCreateWithURL(url, kUTTypeGIF , 1, NULL);

如何爲PNG創建調色板?

回答

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這是不可能在任何情況下。

+0

釋放它之後使用調色板(將'liq_result_destroy(liqRes);'移動到底部)。你也可以使用'liqPal-> entries'作爲顏色表,所以你甚至不需要複製操作。 – Kornel

1

如果你的色彩空間,例如RGB您將設置colorTable像這樣:

{R, G, B, R, G, B, R, G, B, ...} 
+0

有沒有辦法自動生成顏色表? –

+0

有或沒​​有你知道應該在你的顏色表中的顏色? – Danilo

+0

沒有:)一些'自動魔術'。恐怕我自己的量化算法會太慢。 –