Pgmagick 按宽度调整图像大小

1 投票
1 回答
1583 浏览
提问于 2025-04-17 05:57

我正在使用graphicsmagick对图像进行一些简单的操作,比如调整大小、裁剪等等,现在我想通过Python使用pgmagick来实现这些功能。

在调整大小时,我的脚本会发出以下命令:

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的scale似乎没有按照我设定的参数来调整。上面的代码会根据宽度或高度来缩放图像,具体取决于哪个更合适。例如,如果图像的尺寸是240x320,最终得到的图像尺寸是60x80。在graphicsmagick中,它的表现是:

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

我该如何使用pgmagick根据宽度来缩放图像呢?

1 个回答

1

很遗憾,我找不到在pgmagick中实现“调整大小”的方法,因为它使用的是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的图片,如果用resize('80x')来调整大小,函数会先计算出最终的高度,计算方法是360乘以80再除以240,然后用img.scale('80x120')来缩放图片。否则,如果直接使用缩放,结果会变成53.3x80的新图片。

撰写回答