Существует ли более быстрая альтернатива PIL Image.paste для нескольких изображений? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь использовать image.paste, чтобы вставить много изображений на один фон.

Мои изображения содержат свои значения смещения x, y в своих именах файлов (например, Image_1000_2000.png это смещение 1000,2000).

Код ниже работает, но мучительно медленно. Вот что у меня есть:

import re
import glob
from PIL import Image

# Disable Decompression Bomb Protection
Image.MAX_IMAGE_PIXELS = None

# Set the dimensions of the blank canvas
newheight = 13000
newwidth = 13000

# Glob all the PNG images in the folder and create the blank canvas
photos = glob.glob("*.png")
blankbackground = Image.new('RGB', (newheight, newwidth), (0, 0, 0))
blankbackground.save(r'..\bg999.png', "PNG")

for photo in photos:
  blankbackground = Image.open(r'..\bg999.png')
  photog = Image.open(photo)

  # Get the x , y offsets from the filenames using re
  y_value = re.findall(r"0_(\d*).", photo)[0]
  y = int(y_value)
  x_value = re.findall(r'_(\d*).', photo)[0]
  x = int(x_value)

  # The actual paste operation, and save the image to be re-opened later
  blankbackground.paste(photog,(x,y))
  blankbackground.save(r"..\bg999.png")
  print(photo)

Есть предложения по более быстрой альтернативе?

РЕДАКТИРОВАТЬ: Согласно комментариям ниже, нет необходимости сохранять / перезагружать изображение с каждой фотографией. Это делает это значительно быстрее.

1 Ответ

0 голосов
/ 01 мая 2018

Как указали Сиюань и Дэн, Image.save не требует, чтобы вы сохраняли изображение и перезагружали его каждый цикл.

Переместите Image.open до цикла и переместите Image.save в после цикла, как показано:

import re
import glob
from PIL import Image

# Disable Decompression Bomb Protection
Image.MAX_IMAGE_PIXELS = None

# Set the dimensions of the blank canvas
newheight = 13000
newwidth = 13000

# Glob all the PNG images in the folder and create the blank canvas
photos = glob.glob("*.png")
blankbackground = Image.new('RGB', (newheight, newwidth), (0, 0, 0))
blankbackground.save(r'..\bg999.png', "PNG")

# MOVE THE IMAGE.OPEN BEFORE THE LOOP
blankbackground = Image.open(r'..\bg999.png')
for photo in photos:
  photog = Image.open(photo)

  # Get the x , y offsets from the filenames using re
  y_value = re.findall(r"0_(\d*).", photo)[0]
  y = int(y_value)
  x_value = re.findall(r'_(\d*).', photo)[0]
  x = int(x_value)

  # The actual paste operation
  blankbackground.paste(photog,(x,y))
  print(photo)
# MOVE THE IMAGE.SAVE AFTER THE LOOP
blankbackground.save(r"..\bg999.png")

Таким образом, оно идет от десяти минут до десяти секунд.

...