пятница, 30 июля 2010 г.

Python. Масштабирование изображений

С целью изучения Python-а слелал поделку для изменения размеров фотографий в пакетном режиме.

Для работы с изображениями я использовал библиотеку PIL. В Ubuntu эта библиотека предустановлена. В Windows нужно устанавливать самостоятельно. Я использую Python версии 2.7 под Windows. PIL для работы с Python 2.7 можно скачать с effbot.org.

Вот код сценария:

# Resize image

# Command line:
# python imgresize.py -d <directory> -p <percentage>

import os, sys
from PIL import Image

directory_ = sys.argv[sys.argv.index("-d") + 1]
percentage_ = int(sys.argv[sys.argv.index("-p") + 1])

filenames_ = os.listdir(directory_)

for filename_ in filenames_[:]:
    path_ = directory_ + "\\" + filename_
    if not os.path.isfile(path_):
        continue
    try:
        image_ = Image.open(path_)
        size_ = (image_.size[0] * percentage_ / 100, image_.size[1] * percentage_ / 100)
        if percentage_ < 100:
            image_ = image_.resize(size_, Image.ANTIALIAS)
        else:
            image_ = image_.resize(size_, Image.NEAREST)
        image_.save(directory_ + "\\r_" + filename_)
        print path_, "=>", "r_" + filename_, " OK "
    except:
        print path_, "\n", sys.exc_info()
    
print "Finish" 

Параметры командной строки описаны в начале сценария. Сценарий принимает два обязательных параметра: -d – путь, -p – новый размер изображения в процентах. Пример вызова:

python imgresize.py –d «C:\Photos» –p 50

В результате выполнения сценария в каталоге «C:\Photos» будут созданы файлы с именами начинающимися на «r_» и размером в два раза меньше исходных.

среда, 7 июля 2010 г.

Ошибка UnicodeDecodeError в демонстрационном проекте Django

Буквально на днях начал осваивать web-программирование. Начать решил с Python 2.7 + Django 1.1. После прочтения введений восхищению не было предела (оно есть до сих пор). 


Трудность появилась при попытке реализовать пример, приведенный в введении в Django. Трудность заключалась в том, что при попытке загрузить войти в административную часть новосозданного сайта, все отображалось не так как в примерах, а без стилей. При этом в журналах отладочного сервера выдавалось следующее сообщение:

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 280, in run
    self.result = application(self.environ, self.start_response)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 709, in __call__
    mime_type = mimetypes.guess_type(file_path)[0]
  File "C:\Python27\lib\mimetypes.py", line 295, in guess_type
    init()
  File "C:\Python27\lib\mimetypes.py", line 356, in init
    db.read_windows_registry()
  File "C:\Python27\lib\mimetypes.py", line 261, in read_windows_registry
    for ctype in enum_types(mimedb):
  File "C:\Python27\lib\mimetypes.py", line 251, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)


Наличие исходников стандартной библиотеки Python-а позволило найти проблему довольно быстро. Я использую Windows XP. В моем случае проблема заключалась в том, что в реестре в разделе [HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME] содержались подразделы содержащие в названии кириллицу. При удалении этих разделов они автоматически пересоздавались. Поэтому помогло переименование, просто заменил кириллицу латиницей.

Понятно, что это частный случай и настройки системы. Но возможно, эта заметка позволит кому-нибудь сэкономить время.

--

Mihail 2 ноября 2012 г., 22:06

Для тех у кого в registry Windows 7 нет русских ключей, но проблема осталась - переименуйте сетевое имя компьютера с русского на английский языки.

--


Casufi5 декабря 2012 г., 19:06

Решение исправлением библиотеки: http://softwaremaniacs.org/forum/django/31707/