简书链接:视频合成加不规则图片实现方式
文章字数:257,阅读全文大约需要1分钟
不规则图片挖空区域放一个视频。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52


Bitmap bitmapDrawComb = Bitmap.createBitmap(bgBitmap.getWidth(), bgBitmap.getHeight(), bgBitmap.getConfig());

Canvas canvas = new Canvas(bitmapDrawComb);
Paint paint = new Paint();
//绘制背景图层
if (bgBitmap != null) {
canvas.drawBitmap(bgBitmap, new Matrix(), paint);
}
if (bitmapVideoFrame != null) {
//绘制视频图层
int leftMargin = ((FrameLayout.LayoutParams) videoPosterContainer.getLayoutParams()).leftMargin;
int topMargin = ((FrameLayout.LayoutParams) videoPosterContainer.getLayoutParams()).topMargin;
canvas.drawBitmap(bitmapVideoFrame, leftMargin, topMargin, paint);
//绘制视频覆盖区域透明图层解决某问题

//防止图层为空的处理start
if (mModel.getVideoframes() == 1) {
Bitmap bitmapTransVideoExtra = referenceVideoExtraTransCover.get();
if (bitmapTransVideoExtra == null || bitmapTransVideoExtra.isRecycled()) {
bitmapTransVideoExtra = getPosterBgBitmap();
referenceVideoExtraTransCover = new WeakReference<Bitmap>(bitmapTransVideoExtra);
} else {

}
//只裁剪视频插入方块区域 解决不规则图形区域问题
int cropHeight = videoPosterContainer.getHeight();
int cropLeft = leftMargin;
int cropWidth = videoPosterContainer.getWidth();
int cropTop = topMargin;
//绘制背景
Bitmap bitmap = Bitmap.createBitmap(bitmapTransVideoExtra, cropLeft, cropTop, cropWidth, cropHeight);
canvas.drawBitmap(bitmap, cropLeft, cropTop, paint);
//模拟测试
/* if (BuildConfig.DEBUG) {
Rect rect = new Rect(cropLeft, cropTop, cropLeft + cropWidth, cropHeight + cropTop);
paint.setColor(Color.RED);
canvas.drawRect(rect, paint);
}*/
// canvas.drawBitmap(bitmapTransVideoExtra, desc, desc, paint);
//解决不规则图形区域结束


}
if (isNeedDrawText) {

dynamicDrawText(canvas, paint);
}


}

方法就是截屏,但是没有挖空区域的,那么绘制了视频帧图之后再把视频帧图的区域等大高宽的 同等图片背景抠出来再盖上去,上面是具体代码。

另外一种方式是所有文字也动态绘制。
那么先绘制视频,然后绘制视频,然后绘制而其他图片如二维码,然后绘制文字

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
35
36
37
38
Bitmap bitmapDrawComb = Bitmap.createBitmap(posterBgBitmap.getWidth(), posterBgBitmap.getHeight(), posterBgBitmap.getConfig());

Canvas canvas = new Canvas(bitmapDrawComb);
Paint paint = new Paint();

if (bitmapVideoFrame != null) {
//绘制视频图层
int leftMargin = ((FrameLayout.LayoutParams) videoPosterContainer.getLayoutParams()).leftMargin;
int topMargin = ((FrameLayout.LayoutParams) videoPosterContainer.getLayoutParams()).topMargin;
canvas.drawBitmap(bitmapVideoFrame, leftMargin, topMargin, paint);
//绘制视频覆盖区域透明图层解决某问题









}


//绘制背景图层
if (posterBgBitmap != null) {
canvas.drawBitmap(posterBgBitmap, new Matrix(), paint);
}


if (isNeedDrawText) {

dynamicDrawText(canvas, paint);
}



//保存和并的图片到本地
boolean result = ImageUtil.saveBitmapToSDCardByJPG(frameImageInfo.getResultImagePath(), bitmapDrawComb);