最近AVG32情结死灰复燃,终于写出了解读PDT图像文件的代码;
再次重写了AVG的文件解压引擎,利用Object Pascal的多态性,实现了一个引擎解压多种AVG系文件(AVG32 SEEN, PDT, AVG2K SEEN, G00 ...)
顺便研究了一下Windows GDI API, 方便的实现了Alpha通道图像的高速支持...
下面不是骨灰极AVG爱好者以及程序爱好者请不用购买了... ^^
Update: 经过一个多小时的搜索和研究,终于实现了Alpha窗口功能! ^_^Update: 重头整理了对象的继承树,并且加入了资源控制,支持低内存模式! ^_^[Payview=8,32]
->PDT图像阅读演示 (技术预览)<-->PDT图像阅读演示 (带Alpha窗口功能!)(技术预览)<- (详细说明见
第二部分)
->PDT图像阅读演示 (低内存模式)(技术预览)<- (详细说明见
第三部分)
GUI很简陋,主要是为了验证PDTImage对象的正常工作以及Alpha通道的支持。
目前的PDTImage为独立的对象,但是将来会从TGraphic继承下来,并且可以在Graphic单元注册图形类型,从而直接支持通过TPicture在设计时或者运行时直接打开,以及直接对Bitmap进行Assign操作。
使用方法:
0. 直接点击运行;
1. 按下Ctrl然后点击窗口,将会出现打开文件对话框,选定一个有效PDT文件;
2. 使用以下方法用不同方式察看图像:
左键单击 - 将图像部分直接绘制到窗口(不含Alpha通道)
右键单击 - 将Alpha通道部分直接绘制到窗口(以灰度表示)
Shift+左键单击 - 将图像部分转换为一个TBitmap对象然后直接绘制(不含Alpha通道) : 效果应该和左键单击等同
Shift+右键单击 - 将Alpha通道部分转换为一个灰度TBitmap对象然后直接绘制 : 效果应该和右键单击等同
Alt+左键单击 - 在天蓝色的背景下将图像以Alpha通道模式绘制到窗口
Alt+右键单击 - 在天蓝色的背景下将图像直接以透明色模式绘制到窗口 : 应该看得出来在这种模式下图像的边缘发黑,有毛刺
点此观看演示
演示1A: 带Alpha通道支持
演示1B: 不带Alpha通道支持
演示2A: 带Alpha通道支持
演示2B: 不带Alpha通道支持
演示3A: 带Alpha通道支持
演示3B: 不带Alpha通道支持 (一塌糊涂)
0
最后,作为一个Bonus,按下'x'键看看有什么效果? ^_^ (前提是首先要载入一个含有Alpha通道的PDT文件)
*嘿嘿,想知道么*
0
实现了Alpha窗口功能:* 什么是Alpha窗口?
就是整个窗口的内容以Alpha通道混合模式描绘在桌面上
虽然看上去效果和前一个版本提供的Bonus模式一样,但是本质上是完全不同的,用鼠标拖动一下就可以看出来了。
* Alpha窗口有什么好处?
好处多了! ^-^
1. 窗口图像可以和桌面以及其它窗口自然的混合
2. 附带自动实现了不规则窗口功能:
也就是说,看上去完全透明的区域
不仅仅是看上去透明而已;
鼠标的点击动作也是直接穿越了该区域直达下一层窗口的!
* 怎么样激活Alpha窗口模式?
在正常模式下按下'z'键(再按取消)
* 我想看看用透明色而不是Alpha支持是什么样子的?
首先声明: 吓死不怪我...
在正常模式下按下'Z'(注意是大写)键(再按取消)
演示: (左为Alpha窗口,右为透明色窗口)
另外,Alpha窗口模式下,我也把窗口定位于顶端,也就是说,嘿嘿,可以把这个程序用作一个小小的桌面装饰!
(当然还有任务栏按钮,Alt-Tab等不完善的地方,不过毕竟程序本来不是设计为干这个用的,作为附加功能还是不赖吧! ^o^)
资源消耗模式可选:* 几乎从头到尾梳理对象的继承树,现在的结构更加有利于今后的扩展:
AVGClassBase
|->AVGPackageBase
| |->AVG32ScenarioPack
| |->AVG2KScenarioPack
| |->KOEPack
.....
|->AVGFileBase
| |->AVG32Scenario
| |->AVG2KScenario
| |->AVGImageBase
| | |->PDTHandle
| | | \->PDTImage
| | |->G00Handle
| | | \->G00Image
.........
| |->AVGMusicBase
| | |->KOEHandle
| | | \->KOEWave
| | |->NWAHandle
| | | \->NWAWave
.........
* PDTImage对象现在支持四种资源消耗模式:
1. 奢华模式: 提前获取需要的内存和系统对象;
主动更新需要的图像;
如无必要绝不释放资源。
此模式执行效率最高,速度最快。适合资源充足,对象实例数目少的情况。
2. 一般模式: 按需要获取需要的内存和系统对象;
被动更新需要的图像;
如无必要绝不释放资源。
此模式执行效率高,相对节约资源(没有用到的功能将不会占用资源)。适合资源较充足,性能要求较高的情况。
3. 节约模式: 按需要获取需要的内存和系统对象;
被动更新需要的图像;
使用完的系统对象立刻被释放。
此模式执行效率一般,但是节约资源,特别是系统资源(Device Context)。适合系统资源紧张,对象实例数目多的情况。
4. 抠门模式: 按需要获取需要的内存和系统对象;
被动更新需要的图像;
使用完的系统对象和内存资源立刻被释放。
此模式执行效率最低,但是非常节约资源和内存。适合系统资源和内存紧张,对象实例数目多的情况。
哦,顺便说一下,前一个版本的执行效率相当于"抠门模式",资源消耗相当于"节约模式"...
* 更新的程序使用了PDTImage"一般模式"运行,但是当使用Alpha窗口模式时,对象占用的不必要内存资源会被清空,以达到节约内存的效果。(当然程序本身还是基于Delphi VCL的,因此内存消耗也不会很小。如果用Windows API直接创建窗口将会有明显的效果)
* 另外加入了一个小修改,去掉了任务栏上面的按钮。Alpha窗口下的Alt-Tab怎么也去不掉,没办法只有改天再研究了... XD
[/Payview]