再出后续!多媒体实验之宽幅和选做篇

软件设备

Visual Studio2022

修改内容

3、设计实现一个视频特效程序,能够将两个(或多个)视频拼接成一个宽幅视频。

4、试将水波纹模拟程序和YUV视频显示程序结合起来,实现在视频中叠加水波纹(选做)。

内容1:宽幅视频

之前的版本中您可以看到我是直接再创建了一个det_image2来存储第二张图片,然后同时显示det_image和det_image2。但是这样的做法似乎不符合内容的要求。再思考了一下,真正的做法应该是构建一个两倍宽的背景图,再将det_image2的宽度设为原来的2倍,然后在放置像素点时,将两张图片的像素都放进去,直接显示det_image2。

  1. 构建2倍宽的背景图image-20240418111314658

  2. 设置det_image2的宽度为2倍宽,我们用这个变量来显示,无论用det_image还是det_image2都是一样的:02两倍宽

  3. 关键代码如下:

image-20240418111840992

1
2
3
4
5
6
det_image2[288 - i - 1][j].r = r;
det_image2[288 - i - 1][j].g = g;
det_image2[288 - i - 1][j].b = b;
det_image2[288 - i - 1][j + 352].r = r2;
det_image2[288 - i - 1][j + 352].g = g2;
det_image2[288 - i - 1][j + 352].b = b2;
  1. 显示det_image2的时候宽度也要设置为两倍;04两倍显示
  2. 效果如下,看起来是一样的,但是原理是一样的:image-20240418112116881

内容2:选做部分(视频波纹)

原理是这样的:只需要修改渲染函数中的内容即可,实验二中是对bmp图片的像素点进行偏移量的转换,对于视频来说,那么首先yuv转码为rgb的格式,然后对每一帧的rgb值也进行像素点的偏移。所以关键的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
for (int y = 0; y < cyDib - 1; y++) //y就是i,x就是j没问题
for (int x = 0; x < cxDib - 1; x++)
{
// 计算偏移
int xoff = buffer_2[y][x - 1] - buffer_2[y][x + 1];
int yoff = buffer_2[y - 1][x] - buffer_2[y + 1][x];
// 边界处理
if (xoff >= cxDib) xoff = cxDib - 1;
if (xoff < 0) xoff = 0;
if (yoff >= cyDib) yoff = cyDib - 1;
if (yoff < 0) yoff = 0;
// 处理图像偏移,以背景图片做波纹
/*det_image[y][x].b = *(pbits + 0 + (x + xoff) * 3 + (y + yoff) * cxDib * 3);
det_image[y][x].g = *(pbits + 1 + (x + xoff) * 3 + (y + yoff) * cxDib * 3);
det_image[y][x].r = *(pbits + 2 + (x + xoff) * 3 + (y + yoff) * cxDib * 3);*/

det_image[y][x].b = det_image[y + yoff][x + xoff].b;
det_image[y][x].g = det_image[y + yoff][x + xoff].g;
det_image[y][x].r = det_image[y + yoff][x + xoff].r;
}

// 显示当前帧
SetDIBitsToDevice(hdc,
0,
0,
352,
288,
0,
0,
0,
288,
det_image,
pbmi,
DIB_RGB_COLORS);

效果如下:06效果2

更多内容可以查看:https://cds007.github.io/

有问题可在评论区交流~