2016-01-19 3 views
2

Я работаю над проектом, где мне нужно объединить много изображений (80282). Каждое изображение имеет размер 256 x 256 пикселей, а некоторые из файлов пустые (без изображения), поэтому мне нужно создать пустое изображение для замены файла. У меня есть данные в этом формате: data-D0H0-X52773-Y14041Python PIL concatenate images

X и Y соответствуют координатам, которые мне нужно для конкатенации по порядку. Порядок находится в верхнем левом углу X52773-Y14314 в правом нижнем углу X52964-Y14041. Это 294 итерации на X и 274 на Y. Вот код, который я написал, который работает некорректно, я мог бы использовать любую помощь, если у вас есть идея, в настоящее время мои изображения не хорошо выровнены по Y. Например, изображение X10-Y10 не находится под изображением X10-Y11, как и должно быть. Я думаю, что у меня есть некоторая проблема с правильной попыткой: и за исключением: Спасибо, что вам поможет!

from PIL import Image 

width = 75264 
height = 70144 
new_im = Image.new('RGBA', (75264, 70144)) 

x_offset = 0 
y_offset = 0 

coordinate = {} 
coordinate['x']=52672 
coordinate['y']=14314 

#top image line should be from: X52,672-Y14,314 to X52,965-Y14,314 
#bottom image line should be from: X52,672-Y14,041 to X52,965-Y14,041 

for irow in range(0, 274): 
    for icol in range(0, 294): 
     try: 
      if (x_offset == width): 
       coordinate['y'] = coordinate['y'] - 1 
       coordinate['x'] = 52672 
      img = Image.open("data-D0H0-X"+str(coordinate['x'])+"-Y"+str(coordinate['y'])+".png") 

     except: 
      coordinate['x'] = coordinate['x'] + 1 
      blank = Image.new('RGBA', (256,256)) 
      new_im.paste(blank, (x_offset, y_offset)) 
      x_offset += 256 
      if (x_offset == width): 
       x_offset = 0 
       y_offset += 256 
      break 

     new_im.paste(img, (x_offset, y_offset)) 
     x_offset += 256 
     if (x_offset == width): 
      x_offset = 0 
      y_offset += 256 
     coordinate['x'] = coordinate['x'] + 1 


new_im.show() 
new_im.save('full_image.png') 

EDIT: Вот новый код, который я модифицирована в соответствии с вашим ответом. Тем не менее, я все еще получаю сообщение об ошибке: struct.error: «I» формат требует 0 < = число < = 4294967295

Не уверен, если моя координата Расчитать прямо сейчас.

КОД:

from PIL import Image 
import glob 
import imghdr 

width = 75264 
height = 70144 

new_im = Image.new('RGBA', (width, height)) 

for filename in glob.glob('data-D0H0-X*.png'): 
    tmp_arr = filename.split('-') 
    x_coord = int(tmp_arr[2][1:6]) 
    y_coord = int(tmp_arr[3][1:6]) 

    info = imghdr.what(filename) 
    if (info == "png"): 
     new_img = Image.open(filename) 
    else: 
     new_img = Image.new('RGBA', (256,256)) 


    x_coord = (x_coord-52672)*256 
    y_coord = (14314-y_coord)*256 
    print x_coord, y_coord 
    new_im.paste(new_img, (x_coord, y_coord)) 

new_im.show() 
new_im.save('full_image.png') 

ответ

1

Ваша координата арифметика кажется немного прочь. Так как ваши изображения 256x256, вам никогда не придется указывать inc/dec x и y на 1, как в вашем коде. Код ниже не проверен, но должен содержать общую схему.

from PIL import Image 
import glob 

width = 75264 
height = 70144 
new_im = Image.new('RGBA', (width, height)) 

for filename in glob.glob('data-D0H0-X*.png'): 
    tmp_arr = filename.split('-') 
    x_coord = int(tmp_arr[2][1:]) 
    y_coord = int(tmp_arr[3][1:]) 
    small_img = Image.open(filename) 
    new_im.paste(small_img, (x_coord, y_coord)) 

new_im.show() 
new_im.save('full_image.png') 
+0

Привет, спасибо за ваш ответ, это помогло мне! У меня есть еще один вопрос: как я могу получить белое изображение для тех случаев, когда в файле ничего нет? В настоящее время, с кодом, он говорит: IOError: не может идентифицировать данные файла изображения D0H0-X52673-Y14072.png, когда дело касается файлов без данных. – Alex

+0

Ну, вы могли бы избавиться от пустых файлов заранее или добавить проверку, чтобы игнорировать файлы с нулевым размером в цикле: import os; для имени файла в glob.glob ('data-D0H0-X * .png'): if os.stat (filename) .st_size! = 0: .. –

+0

Привет, я нашел способ проверить файл с помощью «imghdr» .какие()". Я отредактировал свой 1-й пост с идеей вашей помощи. Я все еще получаю ошибку, у вас есть идея, как я могу ее решить? – Alex