2012-02-10 88 views
2

我用的是FreeImageNET libary量化我的位图作为减少颜色使用的FreeImage库(C#)

using (FreeImageAPI.FreeImageBitmap fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap(bmp.GetHbitmap())) 
      { 
       if (fiBitmap.ColorDepth > 24) 
       { 
        fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP); 
       } 

       //quantize using the NeuQuant neural-net quantization algorithm 
       fiBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE.FIQ_NNQUANT, 256); 


       fiBitmap.Save("test_z.png", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION); 

       //fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION); 
      } 

这给了我一个PNG-8,有256种颜色的调色板中PNG-8调色板计数。 使用Photoshop我发现,如果我使用自适应算法并减少调色板,例如128,64,16等,我可以进一步缩小尺寸。再次打开它可以让Photoshop填充剩余(较高)索引中的灰度级。

我不能让FreeImageAPI.FreeImageBitmap.Quantize()生产出类似PNG,用有限的调色板,一拉 PIL convert()在这里你可以同时指定算法和调色板大小。

谢谢。

回答

1

最终通过使用来自Internet的开源代码重新实现了量化。

+2

Awww,可能你不能,但是很想在你的答案中看到一些源代码或更多细节,因为我自己也在处理同样的事情。 – eselk 2012-04-24 22:28:42

+0

我也是。另外,你决定使用哪种算法? – wil 2013-11-13 08:56:44

+0

有一段时间没有检查过,我用Octree量化,代码在这里https://github.com/nisheeth-barthwal/Overmind/tree/master/NX_Unsafe/Imaging – nbaztec 2014-11-26 15:23:31