Найти - Пользователи
Полная версия: PIL пересохранение открытой фотографии в худшем качестве
Начало » Python для новичков » PIL пересохранение открытой фотографии в худшем качестве
1
Dr.Livsi
Имеется 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

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

Код не весь, но в том то и странность, что Image не переопределялся.
PooH
Dr.Livsi
Код не весь, но в том то и странность, что Image не переопределялся.
Если не жалко, покажите целиком, хотя бы электропочтой, интересно, чудес то не бывает
Dr.Livsi
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()
GaiveR
Dr.Livsi,

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

Вообще конструкцию
from XXX import *
нужно использовать очень осторожно, а лучше и вовсе её избегать.
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