请高手解释 : Delphi中 24位图象 转化为 256色图象 的问题。(斑竹快来)(88分)

  • 主题发起人 主题发起人 lha
  • 开始时间 开始时间
L

lha

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi中 Load一个 24位的图象
代码:
Image.Picture.BitMap.LoadFromFile('Test.bmp');

然后我们可以用:
代码:
Image.Pictue.BitMap.PixelFormat := pf8Bit ;
将它转变为256色的图象,

可是我想了解一下 Delphi是如何进行这个转换的,看它的Source 看不懂

谁给我 讲讲Source 中用的是什么方法?
 
to lha:
既然你诚心邀请我回答这个问题,我就详细的为大家讲讲关于“分色”的图象处理算法,
可能已经远远超出你所问问题的范畴;只有一个目的,大家多交流。
Delphi里面的图象位数转换,其实现方法并不是太好;这一点你可以通过实例来验证;
比如将一幅24bit真彩图转换为256色位图,存在严重的失真。它的实现机制是:首先枚举
得到位图里的所有颜色(最多可以达到16M色),然后排序,也就是说在得到的所有颜色里
选择出现频率最高的256种色彩,作为256色位图的基色。对于那些不是处于这256色范围的
象素点,它们的处理方法就是依据“最近”原则,也就是将该象素点的色彩与那256种色彩
对照,选择距离最近的一种。正是由于这种分色方式,你得到的256色位图存在严重的失真;
因为这种分色是采用的最原始、最简单的逼近原则来处理的。
其实在我做的CAD系统里面,涉及到大量的分色算法,以后详细说明。
 
to 卷起千堆雪tyn:
>>正是由于这种分色方式,你得到的256色位图存在严重的失真
这个观点不敢苟同,我用 :
Image.Pictue.BitMap.PixelFormat := pf8Bit ;
得到的图像存在着严重的失真,于是我就想寻找一个比较好的算法来解决这个问题,
所以我就看了一下 SetPixeFormat 过程的实现,看不懂 故想问问大家这个问题

其实我前几天就写了一个24位转换为256色的算法,用的思想和你所说的是一样的,
但是, 我想想 这个算法的效果应该是比较好的,至少从我的程序输出上来看效果是不错。

我的个算法是,对原图像中的颜色R、G、B各取前4位, 组成12位(这样就有4096种颜色)
统计各个颜色的使用频率,去除不使用的颜色,然后排序,把使用频率最高的256种颜色
作为调色板, 然后把剩下的那些颜色 与 调色板中的颜色作对比,也就是你所说的“就近原则”
用调色板中的颜色来代替相近的颜色。

从我的程序输出结果来看, 我认为,Delphi中用的算法应该不是上面说提到的算法。
因为 两者的效果差别很大!

>>其实在我做的CAD系统里面,涉及到大量的分色算法,以后详细说明。
能否现在就先 说些要点?



 
大家都来说说呀! 分数可以另外加哦。
 
to 卷起千堆雪tyn:
我的问题 并没有人给我一个回答呀? 我想知道Delphi是如何做这个转换的,
可是,我们两个讨论的不是 Delphi中如何实现呀,你对我说, 这个方法很差
然后又告诉我 分色问题在你的系统里的精华 最后什么都不告诉我 :(
 
to lha:上次俺看到一篇文章介绍的,去找找,找到了给你Email
 
呵呵,收到了
 
to duhl or lha:
偶也想看文章
 
to LeeChange:
nnd , 文章是假的 :(
 
后退
顶部