1. 前言
在处理图片的时候,总是碰到图片缩放拉伸了,但是等比例缩放,又想填充一下其他边界的像素,所以整理了一下代码,希望有点帮助
2. 图片等比例缩放
原图的shape是532*630,但是想修改shape成1920*1080,直接用resize肯定会拉伸,感觉怪怪的,这里先等比例缩放,但是缩放后像素是883*1080,那看看边界的像素值,然后左右填充好了
原图:
修改后的图片:
from PIL import Image, ImageOps
def resize_image(input_image_path, output_image_path, size):
"""
改变图片分辨率,保持比例不变
:param input_image_path: 输入图片路径
:param output_image_path: 输出图片路径
:param size: 输出图片分辨率,格式为元组(宽度,高度)
"""
# 打开原始图片
with Image.open(input_image_path) as image:
# 计算输出图片分辨率的比例
width, height = image.size
ratio = min(size[0] / width, size[1] / height)
new_width = int(width * ratio)
new_height = int(height * ratio)
# 调整图片分辨率
image = image.resize((new_width, new_height))
# 创建输出图片
image.save(output_image_path)
resize_image("test.png", "test_change.png", (1920, 1080))
3.获取像素值
查看test_change.png的(10,10)像素值是(189, 189, 189, 255)
from PIL import Image, ImageOps
def get_pixel_value(image_path, x, y):
"""
获取图片指定位置的像素值
:param image_path: 图片路径
:param x: 横坐标
:param y: 纵坐标
:return: 像素值,格式为 RGB 元组
"""
# 打开图片
with Image.open(image_path) as image:
# 获取像素值
pixel_value = image.getpixel((x, y))
return pixel_value
pixel_value = get_pixel_value("test_change.png", 10, 10)
4.开始在宽度填充吧
(1920-883)/2 = 519,好吧,左右边界分别填充519就行了, 小二,上代码!!!
from PIL import Image, ImageOps
def add_horizontal_border(input_image_path, output_image_path, border, color):
"""
在图片宽度上填充边界
:param input_image_path: 输入图片路径
:param output_image_path: 输出图片路径
:param border: 边界宽度
:param color: 边界颜色,格式为 RGB 元组
"""
# 打开原始图片
with Image.open(input_image_path) as image:
# 计算输出图片的宽度和高度
width, height = image.size
new_width = width + border * 2
new_height = height
# 创建新的画布
new_image = Image.new("RGB", (new_width, new_height), color)
# 将原始图片绘制在画布上
new_image.paste(image, (border, 0))
# 创建输出图片
new_image.save(output_image_path)
add_horizontal_border("test_change.png", "test_change_1.png", 519, (189, 189, 189, 255))
test_change.png:
test_change_1.png:
好了到此结束了,感觉还要很多的改进方面,这是临时做的一个代码,很多地方可以优化,看闲下来的时候看看优化一下,大家闲用着吧,可以点点关注,或者评论一下。