笔头。。
实践启示
posts - 14,comments - 3,trackbacks - 0
    porter-duff等式很简单,记得上学时一般接触的等式就叫定理啥的,为啥计算机的科学就只能叫等式呢,感觉上差了个档次
    在说port-duff等式前先说说计算机的颜色的表示,简单来说是RGB,再加上个Alpha透明度,这段下面的话可以跳过。计算机颜色以RGBchannel三原色来编码(255,255,255)为白色,每种颜色channel的范围是0-255,也有其它编码方式如YUV,因为我不懂所以就不瞎掰了。但对于porter-duff除了三原色channel、定义了另一channel,Alpha channel,Alpha表示透明度,范围也为0-255。可以查看java-doc的AlphaComposite类,其中可以看到(A,R,G,B)表示颜色。(怎么感觉有点像科普文章了
    好了,正式话题。
    A:透明度channel,C:颜色channel
    下面是看一本书的源码的应用程序,Src为红色椭圆,Dst为蓝色矩形
   
   
      
    Clear (Ar=0,Cr=0)
    Color和alpha都是0,dst被src覆盖的像素会消失
   
                                                 
    Dst (Ar=Ad,Cr=Cd)
    无论覆盖在dst的颜色是什么,都不会显示该覆盖颜色
   
    DstAtop
    Ar=As(1-Ad)+AsAd=As
    Cr=Cs(1-Ad)+CdAs
    效果是似乎Dst覆盖在Src上
   
    DstIn和DstOut
    DstIn(Ar=Ad*As,Cr=Cd*As) DstOut(Ar=Ad*(1-As),Cr=Cd*(1-As)
    DstIn和DstOut是相反的,不考虑源像素颜色,使用源像素的透明度影响目标像素
   
    DstOver
    Ar=As*(1-Ad)+Ad;
    Cr=Cs*(1-Ad)+Cd;Dst部分覆盖Src显示,而且dst部分不受alpha影响。Dst外的Src部分正常显示
   
    Src
    Ar=As
    Cr=Cs
    Dst被src覆盖部分不显示。其他正常,src正常显示
   
    SrcAtop
    Ar=As*Ad+Ad*(1-As)=Ad;
    Cr=Cs*Ad+Cd*(1-As)
    Src在Dst部分与Dst混合,Dst颜色不丢失
    Src在Dst外颜色不显示
   
    SrcIn
    Ar=As*Ad;
    Cr=Cs*Ad;
    Src在Dst部分替换Dst
    Src在Dst外舍弃
   
    SrcOut
    Ar=As*(1-Ad);
    Cr=Cs*(1-Ad);
    Src在Dst内丢弃任何颜色
    Src在Dst外正常显示
   
    SrcOver
    Ar=As+Ad(1-As)
    Cr=Cs+Cd(1-As);
    经常见到的Ar和Cr混合
   
    XOR
    公式太长了,就不写了,
    Src在Dst外的正常显示
    Src在Dst内的根据Src的Alpha的补值显示(1-As)
   

    源码下载:版权不归本作者,源码使用时请参照源文件的作者的要求使用http://www.blogjava.net/Files/onedaylover/AlphaCompositesApplication.rar
   
posted on 2008-01-16 14:20 如果有一天de 阅读(2727) 评论(0)  编辑  收藏 所属分类: richclient

只有注册用户登录后才能发表评论。


网站导航: