制造一段DVD待机动画

曾经在微博上流传着一段视频:一群人在酒吧里看着DVD机的屏保画面logo碰到角的时候大家一起欢呼

(其实这个视频的屏幕内容是合成的,原版在这:Fans at Ashton Gate Stadium, Bristol, celebrate England winner against Wales at Euro 2016

虽然这个视频是假的,不过小时候我确实是干过盯着屏保看什么时候能恰好碰到角这个事,通常发生在去超市:家乐福一直都有卖家电小时候去超市又没什么事情干。而亲手做一段DVD屏保的初衷是由于COVID-19大流行,前东家的活动报名人数十分不理想,我负责的会议开闭幕式预算大幅缩水(抹掉几位数的那种),我的老搭档也没法从美国回来,那首当其冲砍掉的就是暖场部分的预算了。不过还是可以利用那块10米*4米的LED屏搞点事的(原本应该是12米*4米的,呜呜呜)。

只用来看Bad Apple确实是有点浪费,对吧

简单来说就是这样:

把logo放在中间然后用一个框圈出需要生成的那帧

每帧都重新生成这听起来就有点烦:所以我把200*200px的logo放在了一个黑底上,然后生成每帧时从这个图上分割出我需要的部分。

变色这件事在matlab里实现也很方便:在RGB矩阵上各乘一个系数就好了

总之,代码如下:

<pre class="wp-block-syntaxhighlighter-code">clear;clc;close all;
path = 'OUTPUT/';
prefix = 'DVD_Animation_';
format = 'png'; 
suffix = strcat('.',format); 
suffix = strcat('.',format); 
step_length = 8;

logo=imread('logo1.png');
logodb(:,:,:,1)=logo;
logo=imread('logo2.png');
logodb(:,:,:,2)=logo;
logo=imread('logo3.png');
logodb(:,:,:,3)=logo;
logo=imread('logo4.png');
logodb(:,:,:,4)=logo;
logo=imread('logo5.png');
logodb(:,:,:,5)=logo;
logo=imread('logo6.png');
logodb(:,:,:,6)=logo;

logo_pointer=1;
logo=logodb(:,:,:,logo_pointer);

if (logo_pointer<=5) logo_pointer=logo_pointer+1;
else logo_pointer=1;
end;

test(:,:,1)=logo(:,:,1).*rand(1);
test(:,:,2)=logo(:,:,2).*rand(1);
test(:,:,3)=logo(:,:,3).*rand(1);

tmp=padarray(test,[2360,2360]);
x=640;
y=1480;
x_dir=1;
y_dir=1;
for i = 1:100000

output=imcrop(tmp,[x,y,1920,1080]);

if (x_dir==1&&x>2360||x_dir==-1&&x<640+step_length)
    x_dir=-1*x_dir;
    x=x+x_dir*step_length;
    logo=logodb(:,:,:,logo_pointer);
    if (logo_pointer<=5) logo_pointer=logo_pointer+1;
    else logo_pointer=1;
    end
    test(: <div name="divHrefB" style="height: 0px;width: 0px;overflow:hidden;"><a href="https://koupit-pilulky.com/koupit-lasix-v-praze.html">koupit-pilulky.com</a></div> ,:,1)=logo(:,:,1).*rand(1);
    test(:,:,2)=logo(:,:,2).*rand(1);
    test(:,:,3)=logo(:,:,3).*rand(1);
    tmp=padarray(test,[2360,2360]);
else
    x=x+x_dir*step_length;
end
if (y_dir==1&&y>2360||y_dir==-1&&y<1480+step_length)
    y_dir=-1*y_dir;
    y=y+y_dir*step_length;
    logo=logodb(:,:,:,logo_pointer);
    if (logo_pointer<=5) logo_pointer=logo_pointer+1;
    else logo_pointer=1;
    end
    test(:,:,1)=logo(:,:,1).*rand(1);
    test(:,:,2)=logo(:,:,2).*rand(1);
    test(:,:,3)=logo(:,:,3).*rand(1);

    tmp=padarray(test,[2360,2360]);
else
     y=y+y_dir*step_length;  
end
imwrite(uint8(output),strcat(path, prefix, num2str(i), suffix),format);
end
% figure();imshow(output);


% imwrite(uint8(logo),strcat(path, prefix, num2str(gray_value), suffix), format);</pre>

最终效果就是这样:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据