- 积分
- 10806
- 威望
- 64
- 魅力
- 63
- 经验
- 7155
- 热心度
- 3
- 注册时间
- 2015-11-15
- 最后登录
- 2024-2-20
- 主题
- 104
- 回帖
- 1839
- 精华
- 8
- 阅读权限
- 120
TA的每日心情 | 开心 2015-12-9 01:09 |
---|
签到天数: 9 天 连续签到: 1 天 [LV.3]火元素使者
版主
- 积分
- 10806
|
楼主 |
发表于 2020-5-23 05:27:10
|
显示全部楼层
今天我们来讲一讲怎么从网上获取新的特效动画DEF。
网上有很多gif动图,但是这些动图绝大多数是半透明图片混合到底色上生成的假半透明图片。几乎没有H3可以直接使用的透明像素和不透明像素分开的图片。
幸好,这些动图中很大部分是黑色或深灰色的底色。这使得我们可以通过一些手段把这些假半透明变成抖动式的半透明。
我利用python写了几个函数。使用时,调用 extractGIFframes2() 和 generateBMPforDEF() 两个函数,生成bmp图片,然后可以用DEF编辑器打包城DEF。
- #例子,两个函数输入的文件夹地址必须一致
- extractGIFframes2('C:/folder')
- generateBMPforDEF('C:/folder')
复制代码
转化gif前,先创建一个文件夹比如叫effect1,把下载的gif动图放到文件夹中。
生成可用图片后变成这个样子:
放入DEF编辑器中的效果:
以下为python代码,需要按照相关库:
- import numpy as np
- import random
- import os
- import cv2
- from matplotlib import pyplot as plt
- #in_path = bmp/gif图片
- #out_path = bmp/gif图片
- #针对黑色背景的GIF
- #根据HSV的V值随机剔除像素
- #比方法2更耐受背景噪音
- def removeTransparency3(in_path, out_path):
- image = cv2.imread(in_path, cv2.IMREAD_COLOR)
- image1 = image.copy()
- image2 = cv2.blur(image, (3, 3)) # 使用均值后的图像决定像素是否清零
- HSV = cv2.cvtColor(image2,cv2.COLOR_BGR2HSV)
- H,S,V = cv2.split(HSV)
- V_Threshold_Lower = (V[0:5,0:5].max())*1.05 # 前五个像素点选最大值作为阈值
- V_Threshold_Upper = 255 - V_Threshold_Lower
-
- #print(V_Threshold_Lower, V_Threshold_Upper)
- #print(V[0:5,0:5])
-
- for i in range(V.shape[0]):
- for j in range(V.shape[1]):
- if V[i,j] < V_Threshold_Lower:
- image1[i,j]=[0,0,0]
- elif V[i,j] < V_Threshold_Upper:
- r = random.random() # 0-1
- if r > (V[i,j] - V_Threshold_Lower)/(V_Threshold_Upper - V_Threshold_Lower):
- image1[i,j]=[0,0,0]
- # 对比原始图片和随机去除透明后的图片
- #plt.figure(figsize=(60,20))
- #plt.subplot(121); plt.imshow(image)
- #plt.subplot(122); plt.imshow(image1)
- #plt.show()
- cv2.imwrite(out_path, image1)
-
- def generateBMPforDEF(framesFolder):
- #输入目标文件夹的路径
- filedir0 = framesFolder
- #设置输出文件夹在输入文件夹内
- filedir1 = filedir0 + '/generated pics'
- #创建新文件夹
- if not os.path.exists(filedir1):
- os.makedirs(filedir1)
- #获取目标文件夹中的文件名称列表
- filenames = os.listdir(filedir0)
- #遍历文件名
- for filename in filenames:
- extension = filename.split('.')[-1]
- if extension == 'bmp'or extension == 'png':
- filepath0 = filedir0 + '/' + filename
- filepath1 = filedir1 + '/' + filename[:-3] + 'bmp'
- #print(filepath0)
- print(filepath1)
- removeTransparency3(filepath0, filepath1)
- def extractGIFframes2(GIFfolder):
- '''
- 约定文件夹中只有一个xxx.gif
- xxx的帧文件保存为GIFfolder/xxx-index.bmp
- 路径中用一律使用'/'
- '''
- #输入目标文件夹的路径
- filedir0 = GIFfolder
- #设置输出文件夹在输入文件夹内
- filedir1 = filedir0 # 直接保存到当前目录
- #获取目标文件夹中的文件名称列表
- filenames = os.listdir(filedir0)
- #遍历文件名,应该保证只有一个gif文件
- for filename in filenames:
- if filename.split('.')[-1] == 'gif':
- filepath0 = filedir0 + '/' + filename
- x=cv2.VideoCapture(filepath0)
- i=1
- while True:
- filepath1 = '%s/%s-%02d.png' % (filedir1, filename.split('.')[0], i)
- ret, frame = x.read()
- if ret == True:
- cv2.imwrite(filepath1, frame)
- i+=1
- else:
- return
复制代码
|
|