python调整图片大小dpi不丢失_使用PIL调整png图像大小会失去透明度

该代码示例展示了如何使用Python的PIL库在调整PNG图像大小时保持其透明度。通过指定新的宽度、高度或参考文件,可以实现不失真的缩放,并可以选择不同的重采样方法。
摘要由CSDN通过智能技术生成

这是一个更复杂的调整大小(保持透明度)的函数:它只允许您使用新的宽度值、新的宽度和高度值或引用文件来获得新的大小。也可以更改重采样方法:## PngResizeTransparency.py

#

## Resize PNG image by keeping the transparency

## thanks to https://stackoverflow.com/users/1453719/nicolas-barbey

#

## Use:

## - using a reference file to get new sizes:

# PNG_ResizeKeepTransparency(SourceFile, ResizedFile, RefFile ='YourRefFile.png')

## - using only the resized width:

# PNG_ResizeKeepTransparency(SourceFile, ResizedFile, new_width)

## - using resized width and hight:

# PNG_ResizeKeepTransparency(SourceFile, ResizedFile, new_width, new_height)

## - using resample mode: add param resample="NEAREST"/"BILINEAR"/"BICUBIC"/"ANTIALIAS"

from PIL import Image

def PNG_ResizeKeepTransparency(SourceFile, ResizedFile, new_width=0, new_height=0, resample="ANTIALIAS", RefFile =''):

# needs PIL

# Inputs:

# - SourceFile = initial PNG file (including the path)

# - ResizedFile = resized PNG file (including the path)

# - new_width = resized width in pixels; if you need % plz include it here: [your%] *initial width

# - new_height = resized hight in pixels ; default = 0 = it will be calculated using new_width

# - resample = "NEAREST", "BILINEAR", "BICUBIC" and "ANTIALIAS"; default = "ANTIALIAS"

# - RefFile = reference file to get the size for resize; default = ''

img = Image.open(SourceFile) # open PNG image path and name

img = img.convert("RGBA") # convert to RGBA channels

width, height = img.size # get initial size

# if there is a reference file to get the new size

if RefFile != '':

imgRef = Image.open(RefFile)

new_width, new_height = imgRef.size

else:

# if we use only the new_width to resize in proportion the new_height

# if you want % of resize please use it into new_width (?% * initial width)

if new_height == 0:

new_height = new_width*width/height

# split image by channels (bands) and resize by channels

img.load()

bands = img.split()

# resample mode

if resample=="NEAREST":

resample = Image.NEAREST

else:

if resample=="BILINEAR":

resample = Image.BILINEAR

else:

if resample=="BICUBIC":

resample = Image.BICUBIC

else:

if resample=="ANTIALIAS":

resample = Image.ANTIALIAS

bands = [b.resize((new_width, new_height), resample) for b in bands]

# merge the channels after individual resize

img = Image.merge('RGBA', bands)

# save the image

img.save(ResizedFile)

return

#######################################################

if __name__ == "__main__":

sFile = './autumn-png-leaf.png'

# resize using new width value (new height is calculated by keeping image aspect)

PNG_ResizeKeepTransparency(sFile, sFile[:-4]+'_resized.png', 400)

# resize using a reference file to get the new image dimension

PNG_ResizeKeepTransparency(sFile, sFile[:-4]+'_resized.png', RefFile = 'autumn-png-leaf_starry-night-van-gogh_fchollet_10.png')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值