参照有关资料,写了几个类,用来实现真彩色图像转16色、256色索引图像。下面是PNG图片转换效果图:
左边是PNG源图,中间是转换后存储的白色背景GIF图片(设置ColorBackground属性可改变背景颜色),右边是没经过转换直接存储的GIF图片。完整代码见我的BLOG文章:http://blog.csdn.net/maozefa/archive/2009/09/24/4592103.aspx
左边是PNG源图,中间是转换后存储的白色背景GIF图片(设置ColorBackground属性可改变背景颜色),右边是没经过转换直接存储的GIF图片。完整代码见我的BLOG文章:http://blog.csdn.net/maozefa/archive/2009/09/24/4592103.aspx
解决方案 »
- delphi 怎样读取另一个窗口的变量
- fastreport3打印内容不刷新的问题
- 使用idftp已经连接到服务器,怎么得到服务器根目录下的所有文件(文件及文件夹).......
- 关于word做报表输出的问题
- 请问windows的"显示桌面"在程序中怎么做
- 请前辈们指点,如何调用有参数的存储过程
- property Handle: HWnd read GetHandle;是什么意思
- 如何将查询的结果集生成一个临时表(在Access数据库中生成)
- 编码实现NTFS格式下删除文件的恢复(续一)
- windows的消息机制问题!!!!!!!!!高手!!!
- 为什么就没声音呢??
- 新手有问题要问:incompatibe types
抖动的目的是为了增强图像的视觉效果,有很多中抖动方式,经典的莫过于flyod抖动了。
这个也是个耗时个过程,GDI函数中有个GetNearestPaletteIndex,但是这里还是可以进一步优化的
通常是这样做的
With logPal
.palNumEntries = mUsedColor
.palVersion = &H300
CopyMemory .palPalEntry(0), ColorTable(0), mUsedColor * 4
End With
mhPal = CreatePalette(logPal)
For i = 0 To 15
For j = 0 To 15
For k = 0 To 15
RGB4096(i, j, k) = GetNearestPaletteIndex(mhPal, RGB(k * 17, j * 17, i * 17))
Next
Next
Next
DeleteObject mhPal
以上代码中ColorTable就是你找到的最优调色板。RGB4096数组中就保存了量化到一定空间的颜色对应的调板索引。当想取得某个RGB颜色对应的索引时,可以这样做NewImageData(Fast) = RGB4096(Spd16(ImageData(Speed + 2)), Spd16(ImageData(Speed + 1)), Spd16(ImageData(Speed)))其中Spd16大概为。
For i = 0 To 255
Spd16(i) = (i + 8) \ 17
If (Spd16(i) < 0) Then Spd16(i) = 0
If (Spd16(i) > 16) Then Spd16(i) = 16
Next