Форум сайта python.su
0
Здравствуйте.
Написал скрипт для уменьшения изображения и наложения на него возядного знака.
На локальном компьютере работает нормально. У меня Python 2.7.5![]()
На хостинге (jino.ru) фото получается с серой сеткой, не понимаю почему она берется.![]()
На хостинге установлены 2 версии Python
$ python -V
Python 2.6.5
$ python2.7 -V
Python 2.7
Пробовал на других хостингах, на большинсктве такая же проблема. Но есть и хостинги, на которых мой скрипт преобразует изображения нормально, без сетки.
В чем может быть проблема?
Вот сам скрипт. Я вообще не Python-программист, поэтому за качество кода прошу не ругать.
Пытался написать этот же функционал на PHP, но он вообще нормально уменьшать фотки не умеет.
# Example
# python resize.py '/Users/elementfani/Downloads/q/1000x1000.jpg' '/Users/elementfani/Downloads/q/387x387.jpg' 387 387 95 '/Users/elementfani/Downloads/q/watermark_3.png'
import sys
from PIL import Image
#print sys.argv
filter = Image.ANTIALIAS #BILINEAR
imageFile = sys.argv[1]
thumbFile = sys.argv[2]
width = int(sys.argv[3])
height = int(sys.argv[4])
quality = int(sys.argv[5])
# Open image
image = Image.open(imageFile)
if image.mode != 'RGBA':
image = image.convert('RGBA')
# Resize image
image = image.resize((width, height), filter)
# If watermark exist
if len(sys.argv) == 7:
watermarkFile = sys.argv[6]
# Open watermark
watermark = Image.open(watermarkFile)
# Resize watermark
if image.size[0] != watermark.size[0] and image.size[1] != watermark.size[1]:
watermark = watermark.resize(image.size, filter)
# Add watermark
layer = Image.new('RGBA', image.size, (0, 0, 0, 0))
position = (image.size[0] - watermark.size[0], image.size[1] - watermark.size[1])
layer.paste(watermark, position)
Image.composite(layer, image, layer).save(thumbFile, quality=quality)
else:
#Resize and save image
image.save(thumbFile, quality=quality)
Отредактировано elementfani (Апрель 4, 2014 21:39:25)
Офлайн
58
Не надо так извращаться 
Есть метод .thumbnail. Он за Вас сделает все необходимое. И даже больше.
Можно вторым аргументом ему передать алгоритм сжатия, чтобы откорректировать результат.
P.S. Будут вопросы - пишите …
Офлайн
0
Не помогло. Переписал скрипт, всё равно серые полосы появляются, если выбрать фильтр Image.ANTIALIAS
Как и прежде, на локальном компе фотки уменьшаются нормально, без серых полос, а на хостинге появляются полосы. (если на мониторе не видно, можно пипеткой проверить в графическом редакторе, на последней фотке фон серый, а не белый)
Image.NEAREST
Image.BILINEAR
Image.BICUBIC
Image.ANTIALIAS
from PIL import Image imageFile = 'original.jpg' size = 100, 100 quality = 100 im = Image.open(imageFile) im.thumbnail(size, Image.NEAREST) im.save('im_nearest.jpg', quality=quality) im = Image.open(imageFile) im.thumbnail(size, Image.BILINEAR) im.save('im_bilinear.jpg', quality=quality) im = Image.open(imageFile) im.thumbnail(size, Image.BICUBIC) im.save('im_bicubic.jpg', quality=quality) im = Image.open(imageFile) im.thumbnail(size, Image.ANTIALIAS) im.save('im_antialias.jpg', quality=quality)
Отредактировано elementfani (Апрель 9, 2014 19:38:42)
Офлайн
58
Вы хотите сказать, что при уменьшении фотографии фон меняется на другой.
Давайте так. Вы прикрепляете фотографию, которая была до и фотографию, которая стала после с указанием места, где все стало плохо 
Офлайн
0
Нельзя сказать, чот фон полностью меняется. На нём появляются светло-серые полосы, которые видны на хорошем мониторе.
Оригинал изображения
Уменьшенное изображение с применением фильтра Image.ANTIALIAS
Место, где стало всё плохо:
Белый фон стал серым, т.к. на нем появились полосы с цветом #fcfcfc (и другими оттенками серого)
Это происходит ТОЛЬКО если фильтр установлен Image.ANTIALIAS, с другими фильтрами фон остается белым, но качество уменьшенного изображения становится очень грубым.
Офлайн
58
Я приношу свои извинения, но я скачал обе фотографии и у меня на обоих фон не белый, а
#fefefe. Могу посоветовать только сделать следующее:
from PIL import Image imageFile = 'original.jpg' size = 100, 100 quality = 100 im = Image.open(imageFile) im = im.convert("RGBA") im.thumbnail(size, Image.ANTIALIAS) im.save('im_antialias.jpg', quality=quality)
Офлайн
0
Прошу прощения, оригинал действительно с серым фоном скинул. Вот файл с идеально белым фоном #FFFFFF
Ваш скрипт тоже затемняет фон и он получается серый.
Теперь и у меня никаких мыслей нет 
Офлайн
58
Другие методы дают значительно хуже результат?
Офлайн
0
Да, можно сравнить на изображениях
Image.NEAREST
Image.BILINEAR
Image.BICUBIC
Image.ANTIALIAS
Видно, что качество значительно теряется, хоть и фон остается белым.
Офлайн
0
Ничего себе, вы все действительно сделать код работает. Но для изменения размера фотографий, я предпочел бы использовать Фоновое изображение программное обеспечение, чтобы сделать это сделать сразу.
Офлайн