首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中调整图像大小需要专家建议,因为现有解决方案有例外情况

在Python中调整图像大小需要专家建议,因为现有解决方案有例外情况
EN

Stack Overflow用户
提问于 2018-07-15 23:51:15
回答 1查看 653关注 0票数 1

现在有三种解决方案来调整图像的大小:第一:

代码语言:javascript
复制
        img = Image.open('C:\\Users\\Vishal\\Desktop\\Test\\xyx.jpg')
        img = img.resize((90, 90), Image.ANTIALIAS)
        img.save('C:\\Users\\Vishal\\Desktop\\Test\\xyz.jpg')

第二个:

代码语言:javascript
复制
        img = Image.open('C:\\Users\\Vishal\\Desktop\\Test\\xyx.jpg')
        bg = Image.new("RGB", img.size, (255, 255, 255))
        bg.paste(img, img)
        bg = bg.resize((90, 90), Image.ANTIALIAS)
        bg.save('C:\\Users\\Vishal\\Desktop\\Test\\xyz.jpg')

第三个:

代码语言:javascript
复制
        img = Image.open('C:\\Users\\Vishal\\Desktop\\Test\\xyx.jpg')
        img = img.convert('RGB')
        img = img.resize((90, 90), Image.ANTIALIAS)
        img.save('C:\\Users\\Vishal\\Desktop\\Test\\xyz.jpg')

对于第一种情况,问题是“无法将模式RGBA写入为JPEG",对于第二种情况,问题是”糟糕的透明度蒙版“,而第三种情况的问题是,它在所有情况下都可以工作,但调整大小后具有透明度的图像的背景为黑色,这是不可接受的,还可以在边缘附近看到扭曲的颜色像素。那么,这些问题的通用解决方案是什么呢?

注意:(所需的输出格式为.jpg,需要调整大小的图像在抓取时格式各不相同,主要是具有透明背景的.png )

更新:根据评论我已经根据alpha条件添加了if else,如下所示:

代码语言:javascript
复制
img = Image.open('C:\\Users\\Vishal\\Desktop\\Test\\xyx.jpg")
has_alpha = img.mode == 'RGBA'
print(has_alpha)
if has_alpha == True:
    bg = Image.new("RGB", img.size, (255, 255, 255))
    bg.paste(img, img)
    bg = bg.resize((80, 80), Image.ANTIALIAS)
    bg.save('C:\\Users\\Vishal\\Desktop\\Test\\xyz.jpg", quality=92)
else:
    img.resize((80, 80), Image.ANTIALIAS)
    img.save('C:\\Users\\Vishal\\Desktop\\Test\\xyz.jpg", quality=92)

它工作得很好,,但在一些罕见的情况下,,has_alpha为false,我得到以下错误。

代码语言:javascript
复制
False
Traceback (most recent call last):
  File "C:\Intel\lib\site-packages\PIL\JpegImagePlugin.py", line 620, in _save
    rawmode = RAWMODE[im.mode]
KeyError: 'P'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "resize.py", line 33, in <module>
    img.save('C:\\Users\\Vishal\\Desktop\\Test\\xyz.jpg", quality=92)
  File "C:\Intel\lib\site-packages\PIL\Image.py", line 1935, in save
    save_handler(self, fp, filename)
  File "C:\Intel\lib\site-packages\PIL\JpegImagePlugin.py", line 622, in _save
    raise IOError("cannot write mode %s as JPEG" % im.mode)
OSError: cannot write mode P as JPEG
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-16 04:49:13

正如PIL错误消息指出的那样,JPEG不支持透明度。要处理使用透明度的图像,需要将它们粘贴到RGB背景图像上。这就是你的第二个选项:Image.new("RGB", img.size, (255, 255, 255))创建一个与img相同大小的新图像,所有像素都设置为(255, 255, 255),即白色。(也可以使用字符串指定PIL的颜色)。

因此,要正确完成此调整大小和转换任务,您需要确定图像是否具有透明度。您可以通过检查Image.mode字符串来执行此操作。如果它是"RGBA",那么图像就是透明的。这是一个简短的演示,它使用中等浅灰色作为背景。我使用pathlib模块从输入文件名创建JPEG文件名。此模块在Python 3.4+中可用。

更新

此代码的原始版本不处理调色板映射的图像,但这个新版本处理,包括具有透明度的调色板映射的图像。

代码语言:javascript
复制
def resize_to_jpg(fname, newsize, background):
    img = Image.open(fname)
    #img.show()

    print('Resizing', fname, 'Mode =', img.mode) 
 
    if img.mode == "P":
        # Handle palette-mapped images
        if 'transparency' in img.info:
            img = img.convert('RGBA')
        else:
            img = img.convert('RGB')

    if img.mode == "RGBA":
        # The image has transparency
        out = Image.new("RGB", img.size, background)
        # Use the image's own alpha channel as the mask
        out.paste(img, mask=img)
    else:
        out = img
    out = out.resize(newsize, Image.ANTIALIAS)
    #out.show()

    # Construct output file name
    outname = str(PurePath(fname).with_suffix('.jpg'))
    out.save(outname, quality=90, optimize=True)
    print(outname, 'saved')

newsize = (120, 120)
background = (192, 192, 192)

files = (
    'RhombicPlain.png', 
    'RhombicAlpha.png', 
)
for fname in files:
    resize_to_jpg(fname, newsize, background)       

输出

代码语言:javascript
复制
Resizing RhombicPlain.png Mode = RGB
RhombicPlain.jpg saved
Resizing RhombicAlpha.png Mode = RGBA
RhombicAlpha.jpg saved

这是我使用视点射线创建的输入图像RhombicPlain.png和RhombicAlpha.png。

下面是输出图像RhombicPlain.jpg和RhombicAlpha.jpg

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51349907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档