Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2011 18:02:01

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Манипуляции с картинкой не сохраняя её в файловой системе.

Добрый день.
У меня есть рабочий код, но необходимо немного его оптимизировать. (Данный код писал сам, так что не халявщик)
Что я делаю:
Беру нудный URL картинки и сохраняю картинку в папке, далее открываю и если она не подходящего формата, изменяю её на подходящий, сохраняю, открываю её и накладываю вотермарк, сохраняю заменяя прошлую, далее открываю и изменяю её размеры, сохраняю.
Все действия быстро выполняются, кроме первого сохранения её с оригинала:

urllib.urlretrieve(IMG_URL, '' + str(DATA_DIR) + '/' + str(ID) + '.jpg')
Это занимает много времени. Измерял, вот что выдало:
Save IMG: 14.438s
Save IMG: 13.813s
Если картинка битая, то я беру текст нужный и накладываю его просто поверх картинки, и это занимает время:
Save IMG: 0.297s
Save IMG: 0.203s

Подскажите пожалуйста возможные пути оптимизации. Как манипулировать изображением не сохраняя его в промежутках?

Python 2.5
Полный код:
urllib.urlretrieve(IMG_URL, '' + str(DATA_DIR) + '/' + str(ID) + '.jpg')
img = Image.open('' + str(DATA_DIR) + '/' + str(ID) + '.jpg')
img = img.convert('RGB')
img.save('' + str(DATA_DIR) + '/' + str(ID) + '.jpg')
wm = Image.open("1.png")
add_watermark(img, wm, 1, 50).save('' + str(DATA_DIR) + '/' + str(ID) + '.jpg')
img = Image.open('' + str(DATA_DIR) + '/' + str(ID) + '.jpg')
thumbs = ()
thumbs += create_thumbnails(img, (300,))
thumbs[0].save('' + str(DATA_DIR) + '/' + str(ID) + '.jpg')



Офлайн

#2 Янв. 4, 2011 20:40:41

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Манипуляции с картинкой не сохраняя её в файловой системе.

Намек: PIL.Image.open принимает file like object в качестве первого параметра.
Должен быть двоичный, с поддержкой методов .read, .seek и .tell



Офлайн

#3 Янв. 4, 2011 22:14:43

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Манипуляции с картинкой не сохраняя её в файловой системе.

Андрей Светлов
Намек: PIL.Image.open принимает file like object в качестве первого параметра.
можно чуть проще
import ImageFile
p=ImageFile.Parser()
p.feed(image_data)
img=p.close()



Офлайн

#4 Янв. 5, 2011 00:07:25

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Манипуляции с картинкой не сохраняя её в файловой системе.

Да, так лучше. Забыл совсем



Офлайн

#5 Янв. 5, 2011 10:05:39

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Манипуляции с картинкой не сохраняя её в файловой системе.

УРА, УРА!!
Огромное спасибо. Вот это круто, теперь весь код в 1с выполняется. Если бы вы знали сколько времени сэкономили…

И приведу код который реально использовал, взял за основу код от igor.kaist
Применительно к исходному коду, который выкладывал в заголовном сообщении:

f = urllib.urlopen(IMG_URL)
p = ImageFile.Parser()

while True:
s = f.read(1024)
if not s:
break
p.feed(s)
img = p.close()
Если кому не сложно и кто чётко понимает, прокомментируйте пожалуйста строки:
s = f.read(1024)
p.feed(s)
Люблю когда понимаю весь код.



Офлайн

#6 Янв. 5, 2011 20:45:31

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Манипуляции с картинкой не сохраняя её в файловой системе.

KarDer_Groom
Если кому не сложно и кто чётко понимает, прокомментируйте пожалуйста строки:
s = f.read(1024)
p.feed(s)
Люблю когда понимаю весь код.
Читаем (загружаем) следующие 1024 байта и скармливаем их парсеру. p.close() говорит парсеру “хватит, я закончил” :)
P.S. Вот чудесные доки по PIL http://www.pythonware.com/library/pil/handbook/



Офлайн

#7 Янв. 6, 2011 11:53:02

RMNX.rc
От:
Зарегистрирован: 2011-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Манипуляции с картинкой не сохраняя её в файловой системе.

я делал так

import urllib2
import StringIO
import Image
...

img = urllib2.urlopen("http://path_to_image")
img = img.read()
img = StringIO.StringIO(img)
img = Image.open(img)
Не знаю насчет быстродействия, но если стоит задача не сохранять изображение, то можно вот так.



Офлайн

#8 Янв. 6, 2011 21:16:29

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Манипуляции с картинкой не сохраняя её в файловой системе.

RMNX.rc
Не знаю насчет быстродействия
будет чуть медленней и больше оперативной памяти займет…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version