Skip to main content
 首页 » 编程设计

python之如何将图像合并为透明层

2025年05月04日20dyllove98

我正在为 raspberry pi 开发视频编辑器,我在将图像叠加到图像上时遇到问题。目前,使用 imagemagick 在树莓派上使用 1080x1920 png 图像将一张图像放在另一张图像上最多需要 10 秒,这太多了。随着图像数量的增加,时间也会增加。关于如何加快速度的任何想法? Imagemagick 代码:

composite -blend 90 img1.png img2.png new.png 

不透明度支持速度较慢的视频编辑器 here

--------编辑--------

稍微快一点的方法:

import numpy as np 
from PIL import Image 
size_X, size_Y = 1920, 1080#  put images resolution, else output may look wierd 
image1 = np.resize(np.asarray(Image.open('img1.png').convert('RGB')), (size_X, size_Y, 3)) 
image2 = np.resize(np.asarray(Image.open('img2.png').convert('RGB')), (size_X, size_Y, 3)) 
output = image1*transparency+image2*(1-transparency) 
Image.fromarray(np.uint8(output)).save('output.png') 

请您参考如下方法:

我的 Raspberry Pi 目前不可用 - 我只是说有一些烟雾,我做的是软件,而不是硬件!因此,我只在 Mac 上测试过。它使用 Numba。

首先我在这两张图片上使用了你的 Numpy 代码:

和

然后我使用 Numba 实现了同样的事情。 Numba 版本在我的 iMac 上运行速度提高了 5.5 倍。由于 Raspberry Pi 有 4 个内核,您可以尝试尝试:

@jit(nopython=True,parallel=True) 
def method2(image1,image2,transparency): 
   ... 

代码如下:

#!/usr/bin/env python3 
 
import numpy as np 
from PIL import Image 
 
import numba 
from numba import jit 
 
def method1(image1,image2,transparency): 
   result = image1*transparency+image2*(1-transparency) 
   return result 
 
@jit(nopython=True) 
def method2(image1,image2,transparency): 
   h, w, c = image1.shape 
   for y in range(h): 
      for x in range(w): 
         for z in range(c): 
            image1[y][x][z] = image1[y][x][z] * transparency + (image2[y][x][z]*(1-transparency)) 
   return image1 
 
i1 = np.array(Image.open('image1.jpg').convert('RGB')) 
i2 = np.array(Image.open('image2.jpg').convert('RGB')) 
 
res = method1(i1,i2,0.4) 
res = method2(i1,i2,0.4) 
 
Image.fromarray(np.uint8(res)).save('result.png') 

结果是:

其他想法...我就地进行了合成,覆盖了输入 image1 以尝试节省缓存空间。这可能会有所帮助或阻碍 - 请尝试。我可能没有按最佳顺序处理像素 - 请尝试。