Уведомления

Группа в Telegram: @pythonsu

#1 Июль 5, 2012 10:56:02

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве

Имеется jpeg-файл, сохраненный в максимально возможном качестве.
Задача: пересохранить этот файл в более низком разрешении и качестве.

from PIL import Image


def resave_pict(path2file):
'''Пересохраняет конкретный файл в среднем качестве'''
print u'Пересохраняем файл', path2file
im=open(path2file, 'rb')
myimg=Image.open(im)
im.close()
if myimg.mode not in ('L', 'RGB'):
myimg = myimg.convert('RGB')
sizes=myimg.size

if max(sizes)>1200:
maxsize=1200
else:
maxsize=max(sizes)

myimg.thumbnail(maxsize, Image.NEAREST)
myimg.save(path2file)
Выдает ошибку, пишет:
AttibuteError: class Image has no attibute ‘open’

Хотя в другом своем проекте я прекрасно открывал с помощью Image.open() файловые объекты.



Отредактировано Dr.Livsi (Июль 5, 2012 11:01:34)

Офлайн

#2 Июль 5, 2012 14:59:01

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве


Все, разобрался. import надо было в тело процедуры поместить.



Отредактировано Dr.Livsi (Июль 5, 2012 22:19:43)

Офлайн

#3 Июль 6, 2012 05:54:45

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве

Dr.Livsi
Все, разобрался. import надо было в тело процедуры поместить.
Не понял?! Это не весь код? Там где-то Image переопределялся?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Июль 9, 2012 15:12:13

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве

PooH
Dr.Livsi
Все, разобрался. import надо было в тело процедуры поместить.
Не понял?! Это не весь код? Там где-то Image переопределялся?

Код не весь, но в том то и странность, что Image не переопределялся.



Офлайн

#5 Июль 9, 2012 16:55:09

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве

Dr.Livsi
Код не весь, но в том то и странность, что Image не переопределялся.
Если не жалко, покажите целиком, хотя бы электропочтой, интересно, чудес то не бывает



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Июль 12, 2012 15:06:09

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве

PooH
Dr.Livsi
Код не весь, но в том то и странность, что Image не переопределялся.
Если не жалко, покажите целиком, хотя бы электропочтой, интересно, чудес то не бывает
не жалко, постараюсь сбросить в ближайшее время.
Вот:
#!/usr/bin/env python
# -*- coding: utf-8 -*-



import os, distutils.filelist
# from PIL import Image
# import Image


from Tkinter import *
import tkMessageBox


class ResaveJPG(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack({'padx':5, 'pady':5})
self.createWidgets()

def createWidgets(self):
self.ent=Entry(self, width=50)
self.ent.insert(0,u'Путь к папке')
self.btn=Button(self, width=10, text=u'Пуск')
self.btn.bind('<Button-1>', lambda _:resave_all(self.ent.get()))

self.ent.grid(row=0, column=0, padx=5, pady=5, sticky=N)
self.btn.grid(row=0, column=1, padx=5, pady=5, sticky=N)


def myfltr(path2file):
if path2file.count('_720')==0 and path2file.count('_160')==0 and path2file.lower().count('.jpg')!=0:
return True

def resave_pict(path2file):
'''Пересохраняет конкретный файл в среднем качестве'''
from PIL import Image
print u'Пересохраняем файл', path2file
im=open(path2file, 'rb')
myimg=Image.open(im)

if myimg.mode not in ('L', 'RGB'):
myimg = myimg.convert('RGB')
sizes=myimg.size

if max(sizes)>1200:
maxsize=1200
else:
maxsize=max(sizes)

try:
myimg.thumbnail((maxsize,maxsize), Image.NEAREST)
myimg.save(path2file)
except IOError:
print u'Файл', path2file, u'не пересохранен'

im.close()


def resave_all(path):
'''Ищет jpeg файлы в папке path рекурсивно. Убирает 720 и 160. Оригиналы пересохраняет в среднем качестве'''
a=distutils.filelist.findall(path)
b=filter(myfltr, a)
map(resave_pict,b)
print u'Файлы пересохранены'


def run_resave(master=Tk()):
app=ResaveJPG(master)
app.master.title(u'Уменьшаем размер фотографий!')
app.mainloop()


if __name__=='__main__': run_resave()



Отредактировано Dr.Livsi (Июль 13, 2012 22:09:39)

Офлайн

#7 Июль 15, 2012 17:29:11

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

PIL пересохранение открытой фотографии в худшем качестве

Dr.Livsi,

>>> from Tkinter import *
>>> Image
<class Tkinter.Image at 0x016D0CA8>
>>>

Вообще конструкцию
from XXX import *
нужно использовать очень осторожно, а лучше и вовсе её избегать.



Отредактировано GaiveR (Июль 15, 2012 17:30:21)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version