绿幕特效视频的透明通道输出与拼合为图像矩阵

既然之前的特效实现提升到了质的飞跃,那么就考虑敌机(本机)爆炸时的效果问题了。

首先download下某个绿幕爆炸特效视频:

绿幕特效视频的透明通道输出与拼合为图像矩阵_第1张图片

本次使用aftereffects进行抠像:

首先视频导入到ae中,在效果->抠像->中选择一个效果,比如keylight,并在参数中选择屏幕颜色(screen color)取色为背景色:

绿幕特效视频的透明通道输出与拼合为图像矩阵_第2张图片

之后对视频裁剪、调整大小后,点击合成->添加到渲染队列 :

点击蓝色 “无损”,弹出输出设置

绿幕特效视频的透明通道输出与拼合为图像矩阵_第3张图片

并调整参数如下:

绿幕特效视频的透明通道输出与拼合为图像矩阵_第4张图片

png序列、RGB+Alpha(裁剪,调整大小等也可以在这微)

点击确定后点击渲染即可。

输出效果如下:

绿幕特效视频的透明通道输出与拼合为图像矩阵_第5张图片

接下来对图像进行裁剪、缩小和拼合。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

原单图像大小为720*1280, 根据图像的内容,把图像矩阵前600行,341列到940列的内容保存即可,裁剪后图像的大小为600*600,然后缩放(imresize)到100*100后拼合,matlab代码如下:

file_path='D:\MyG\images\explode\';%序列位置
img_path_list = dir(strcat(file_path,'爆炸*.png'));%根据公共前缀名获得列表
img_num = length(img_path_list);%序列长度/图片个数
rm=100;%缩小后的高
rn=100;
result=zeros(rm*12,rn*12,3);%存储单个帧拼合后的图像
splice_alpha=zeros(rm*12,rn*12);%存储单个透明通道拼合后的总通道(对应result)
for i=1:img_num
    img_name=img_path_list(i).name;%取列表的每个元素名
    [img,mapa,alpha]=imread(strcat(file_path,img_name));%读取图像 获得矩阵img map 和alpha
    img_tailor=img(1:600,341:940,:);
    alpha_tailor=alpha(1:600,341:940);
    %imshow(img_tailor);
    img_scan=imresize(img_tailor,[rm,rn]);
    alpha_scan=imresize(alpha_tailor,[rm,rn]);
    rw=mod(i-1,12)+1;%根据i计算该图像处于第几列
    re=floor((i-1)/12)+1;%根据i计算该图像处于第几行
    result((re-1)*rm+1:re*rm,(rw-1)*rn+1:rw*rn,1:3)=img_scan;%每个位置放入图像
    splice_alpha((re-1)*rm+1:re*rm,(rw-1)*rn+1:rw*rn)=alpha_scan;
    %f=imshow(img); 
    %set(f,'AlphaData',alpha_tailor); %直接imshow不能显示透明效果,要再加入该句才可以
end
imwrite(uint8(result),'explode.png','Alpha',uint8(splice_alpha))%保存 

拼合后效果图如下:

绿幕特效视频的透明通道输出与拼合为图像矩阵_第6张图片

 

使用之前文章(https://mp.csdn.net/postedit/91409885)里运行后效果:

绿幕特效视频的透明通道输出与拼合为图像矩阵_第7张图片

爆炸出现的位置等调整可在Animation中加入函数每次敌机死亡后传入位置并更新,在最开始游戏初始化时load就可以。 

你可能感兴趣的:(pygame)