KeyFC欢迎致辞,点击播放
资源、介绍、历史、Q群等新人必读
KeyFC 社区总索引
如果你找到这个笔记本,请把它邮寄给我们的回忆
KeyFC 漂流瓶传递活动 Since 2011
 

土豆星专卖 [本作淘汰,请使用PDTWidgets]

[ 11875 查看 / 29 回复 ]

最近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+右键单击 - 在天蓝色的背景下将图像直接以透明色模式绘制到窗口 : 应该看得出来在这种模式下图像的边缘发黑,有毛刺

点此观看演示


  最后,作为一个Bonus,按下'x'键看看有什么效果? ^_^ (前提是首先要载入一个含有Alpha通道的PDT文件)
*嘿嘿,想知道么*



实现了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]
分享 转发
飛べない翼に、意味はあるんでしょうか?
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

沙发。
此物必买。
ツバサを結ぶ
リボンを解いて
ユメを飛ばしたいの
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

啊,新的土豆-v-

购入
(´・ω・`)
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

咕噜。。。下了以后才发现电脑里竟然一个PDT文档都没有 --;

还有,演示的图看不到 ;;
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

看不到演示图属于RPWT...我管不了 -v-
至于PDT文件,要追溯到远古的Kanon / AIR时代了...


BTW, 终于玩到了Clannad语音版了... -v-
飛べない翼に、意味はあるんでしょうか?
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

咋我按x出来的图是都有蓝色背景而不是透明背景的呢?
ツバサを結ぶ
リボンを解いて
ユメを飛ばしたいの
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

购买成功
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

问个杀问题,这是什么,能用来做什么?
既然来到这里就要知道为什么来,该做什么........
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

原来AIR的PDT图档自带alpha通道啊。
以前用susie抽出来的图都有锯齿,以为是AVG32引擎有全屏反锯齿(
)功能..
俺は俺であり、そして俺はここにいることを証明し続けるため——
TOP

回复:土豆星专卖 [本作淘汰,请使用PDTWidgets]

以下引用orlye在2006-3-15 18:56:25的发言:
咋我按x出来的图是都有蓝色背景而不是透明背景的呢?


这个大概是因为你屏幕没有使用32位色。
飛べない翼に、意味はあるんでしょうか?
TOP