Pgmagick изменить размер изображения по ширине - PullRequest
1 голос
/ 09 ноября 2011

Я использую graphicsmagick для выполнения простых операций с изображениями, таких как изменение размера, обрезка и т. Д., И вместо этого я пытаюсь использовать pgmagick через python.

Для изменения размера скрипт выполняет следующие команды

gm convert image.jpg -resize 80x ...

Изменение размеров магов в соответствии с шириной - моя главная задача, и приведенная выше команда работает, как я и ожидал, учитывает только ширину для изменения размера.Используя pgmagick, я пытаюсь выполнить ту же операцию, как указано ниже:

import pgmagick as p
img = p.Image(p.Blob(open('image.jpg','rb').read()))
img.scale('80') # or img.scale('80x')

Шкала pgmagick, похоже, не соответствует параметру.Код выше масштабирует изображение по ширине или высоте, что всегда уместно.например, если изображение имеет размеры 240x320, полученное изображение имеет размеры 60x80.с точки зрения graphicsmagick, он ведет себя как

gm convert image.jpg -resize \>80x -resize x80\> ...

Как я могу масштабировать изображение по ширине, используя pgmagick?

1 Ответ

1 голос
/ 14 ноября 2011

К сожалению, не удалось найти способ реализовать «изменение размера» в pgmagick, поскольку он использует API C ++, который пока поддерживает только масштабирование.

Тем не менее, он реализован так же ужасно, как:

def resize(new_size):
     g = pgmagick.Geometry(new_size) # distinguishes whether width, height or both given
     image = pgmagick.Image(img)
     rw, rh = image.size()
     w, h = g.width(), g.height()
     if w and not h:
         g.height(int(rh * w * 1.0/rw))
     elif h and not w:
         g.width(int(rw * h * 1.0/rh))

     image.scale(g)

если ширина имеет важное значение при изменении размера, то окончательный размер корректируется в соответствии с шириной и высотой соответственно. Например: размер изображения 240x360 будет изменен путем изменения размера ('80x'), затем функция рассчитывает конечную высоту на 360 * 80/240 и использует масштаб изображения как img.scale ('80x120'), в противном случае используется только масштаб напрямую приведет к новому изображению 53,3x80

...