Найти - Пользователи
Полная версия: Манипуляции с картинкой не сохраняя её в файловой системе.
Начало » Python для новичков » Манипуляции с картинкой не сохраняя её в файловой системе.
1
KarDer_Groom
Добрый день.
У меня есть рабочий код, но необходимо немного его оптимизировать. (Данный код писал сам, так что не халявщик)
Что я делаю:
Беру нудный 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')
Андрей Светлов
Намек: PIL.Image.open принимает file like object в качестве первого параметра.
Должен быть двоичный, с поддержкой методов .read, .seek и .tell
igor.kaist
Андрей Светлов
Намек: PIL.Image.open принимает file like object в качестве первого параметра.
можно чуть проще
import ImageFile
p=ImageFile.Parser()
p.feed(image_data)
img=p.close()
Андрей Светлов
Да, так лучше. Забыл совсем
KarDer_Groom
УРА, УРА!!
Огромное спасибо. Вот это круто, теперь весь код в 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)
Люблю когда понимаю весь код.
igor.kaist
KarDer_Groom
Если кому не сложно и кто чётко понимает, прокомментируйте пожалуйста строки:
s = f.read(1024)
p.feed(s)
Люблю когда понимаю весь код.
Читаем (загружаем) следующие 1024 байта и скармливаем их парсеру. p.close() говорит парсеру “хватит, я закончил” :)
P.S. Вот чудесные доки по PIL http://www.pythonware.com/library/pil/handbook/
RMNX.rc
я делал так
import urllib2
import StringIO
import Image
...

img = urllib2.urlopen("http://path_to_image")
img = img.read()
img = StringIO.StringIO(img)
img = Image.open(img)
Не знаю насчет быстродействия, но если стоит задача не сохранять изображение, то можно вот так.
igor.kaist
RMNX.rc
Не знаю насчет быстродействия
будет чуть медленней и больше оперативной памяти займет…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB