当前位置: 首页 > news >正文

使用Python实现产品图片自动化处理

大家好,在当今的数字化时代,产品图片在电子商务和市场营销中发挥着至关重要的作用。然而,为在线平台准备产品图片可能是一项耗时的任务,本文将分享一个Python脚本,用于自动化产品图片的图像处理工作流程。通过使用Python Imaging Library(PIL)rembg库,可以实现删除图片背景,裁剪图片以适应产品尺寸,调整图片大小,并创建具有特定大小和颜色的新画布。

脚本概述

今天本文要讨论的脚本遵循以下步骤:

  1. 使用rembg库删除图片背景。

  2. 裁剪图片,仅包含产品尺寸。

  3. 调整裁剪后的图片到指定的大小,同时保持宽高比。

  4. 创建具有指定大小和颜色的新画布。

  5. 将调整大小后的产品图片粘贴到新画布上。

安装和使用

要运行脚本,需要安装PIL(Pillow)库和rembg库。你可以使用pip安装它们:

pip install pillow rembg

要使用该脚本,请按照以下步骤操作:

  1. 将你的产品图片放置在指定的文件夹和子文件夹中。

  2. 在脚本中更新folder_dir变量,以使其指向包含你的产品图片的文件夹。

  3. 使用Python解释器运行脚本。

脚本将处理文件夹及其子文件夹中的所有产品图片,应用前面提到的图像处理步骤。处理后的图像将进行保存,并在原始文件名后附加“_Processed”后缀。

函数解释

append_id(filename)

def append_id(filename):p = Path(filename)return "{0}_{2}{1}".format(Path.joinpath(p.parent, p.stem), ".png", "Processed")

此函数会在输出图像文件名附加一个ID。它以原始文件名作为输入,并返回附加了“_Processed”后缀的修改后的文件名。这有助于区分处理后的图像和原始图像。

autocrop_image(img, border=0)

def autocrop_image(img, border=0):bbox = img.getbbox()img = img.crop(bbox)(scale, height) = img.sizescale += border * 2height += border * 2cropped_image = Image.new("RGBA", (scale, height), (0, 0, 0, 0))cropped_image.paste(img, (border, border))return cropped_image

此函数通过删除任何不必要的空白或背景来自动裁剪图像,它接受一个输入图像img和一个可选border参数(默认为0),该参数用于在裁剪后的图像周围添加额外的填充。其使用img.getbbox()计算图像的边界框,将图像裁剪为边界框的内容,然后创建一个适当大小的新图像以容纳裁剪后的图像和边框,最后将裁剪后的图像粘贴到新图像上,并返回裁剪后的图像结果。

resize_image(img, myScale)

def resize_image(img, myScale):img_width, img_height = img.sizeif img_height > img_width:hpercent = (myScale/float(img_height))wsize = int((float(img_width)*float(hpercent)))resized_img = img.resize((wsize, myScale), Image.Resampling.LANCZOS)if img_width > img_height:wpercent = (myScale/float(img_width))hsize = int((float(img_height)*float(wpercent)))resized_img = img.resize((myScale, hsize), Image.Resampling.LANCZOS)return resized_img

此函数可在保持宽高比的同时缩放图像,接受输入图像img和所需缩放比例myScale。首先函数根据比较图像的高度和宽度来确定图像是纵向还是横向,然后使用所需的比例计算出相应的调整大小的尺寸,最后使用img.resize()根据计算出的尺寸调整图像大小,并返回调整大小后的图像。

resize_canvas(img, canvas_width, canvas_height)

def resize_canvas(img, canvas_width, canvas_height):old_width, old_height = img.sizex1 = int(math.floor((canvas_width - old_width) / 2))y1 = int(math.floor((canvas_height - old_height) / 2))mode = img.modeif len(mode) == 1:new_background = (255)if len(mode) == 3:new_background = (255, 255, 255)if len(mode) == 4:new_background = (255, 255, 255, 255)newImage = Image.new(mode, (canvas_width, canvas_height), new_background)newImage.alpha_composite(img, ((canvas_width - old_width) // 2, (canvas_height - old_height) // 2))return newImage

此函数可调整画布大小并将图像放置于其中,它接受输入图像img、画布宽度canvas_width和画布高度canvas_height。该函数根据画布尺寸与图像尺寸之间的差异,计算出将图像居中放置于画布上所需的位置,然后创建一个具有指定画布尺寸和根据图像模式确定的适当背景色的新图像。最后在计算出的位置将输入图像粘贴到新图像上,并返回调整画布尺寸后的图像。

process_files(folder_dir)

def process_files(folder_dir):for entry in os.scandir(folder_dir):if entry.is_file() and entry.name.lower().endswith(image_extensions):image_path = entry.pathimg = Image.open(image_path)output_path = append_id(image_path)removedBGimage = remove(img, True)croppedImage = autocrop_image(removedBGimage, 0)resizedImage = resize_image(croppedImage, 700)combinedImage = resize_canvas(resizedImage, 1000, 1000)combinedImage.save(output_path)elif entry.is_dir():process_files(entry.path)

此函数可处理指定文件夹及其子文件夹中的文件,以folder_dir作为输入,函数使用os.scandir()迭代遍历文件夹中的每个条目。如果条目是一个文件并且具有受支持的图像扩展名,它使用Image.open()打开该图像,然后通过调用append_id()函数生成输出路径,使用rembg库中的remove()函数删除图像背景,自动裁剪图像,调整图像大小,创建新画布,并将处理后的图像保存到输出路径。如果条目是一个目录,则它递归调用process_files()函数以处理子目录中的文件。

本文探讨了一个Python脚本,用于自动化产品图片的图像处理。通过充分利用PILrembg的功能,可以删除图像背景、裁剪图像、调整图像大小并创建新画布,以获得精美和专业的外观。通过自动化这一工作流程,可以节省准备产品图片用于各种电子商务和市场营销平台的时间和精力。

相关文章:

使用Python实现产品图片自动化处理

大家好,在当今的数字化时代,产品图片在电子商务和市场营销中发挥着至关重要的作用。然而,为在线平台准备产品图片可能是一项耗时的任务,本文将分享一个Python脚本,用于自动化产品图片的图像处理工作流程。通过使用Pyth…...

在CSDN学Golang云原生(git)

一,git的工作流程 Golang的Git工作流程与其他语言的Git工作流程类似,通常包括以下步骤: 创建分支:在本地代码库中创建一个新的分支,该分支用于开发新功能或修复错误。编写代码:在创建的分支上进行编码&am…...

QT多线程编程基础

文章目录 前言一、线程,进程 介绍二、创建线程三、终止线程总结 前言 一、线程,进程 介绍 线程: 是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源,如内存和文件…...

TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程

前言: onnx是microsoft开发的一个中间格式,而onnxruntime简称ort是microsoft为onnx开发的推理引擎。允许使用onnx作为输入进行直接推理得到结果。 py接口的推理过程: main函数: if __name__ "__main__":session onn…...

layui+drogon完成文件上传(简例)

layui界面加入按钮、文本框、进度条&#xff1a; <div class"layui-row"><button type"button" class"layui-btn" id"file_upload_control">文件上传</button><input type"file" id"files_input…...

高精度地图服务引擎项目

技术栈&#xff1a;使用vue3TypeScriptElement PlusPiniaaxios 项目描述&#xff1a;高精度地图服务引擎项目&#xff0c;提供轻量化处理3D瓦片切片分布式处理分发服务的一站式解决方案 工作内容&#xff1a;1、项目60%已上的页面开发 2、部分模块的功能实现&#xff0c; 3、封…...

PyTorch使用Transformer进行机器翻译

文章目录 简介数据集环境要求实验代码实验结果参考来源 简介 本文使用PyTorch自带的transformer层进行机器翻译&#xff1a;从德语翻译为英语。从零开始实现Transformer请参阅PyTorch从零开始实现Transformer&#xff0c;以便于获得对Transfomer更深的理解。 数据集 Multi30…...

LoadRunner使用教程

1. LoadRunner简介 LoadRunner是一款广泛使用的性能测试工具 可以对各种应用程序进行性能测试&#xff0c;包括Web应用程序、移动应用程序、企业级应用程序等。它提供了一个综合的性能测试解决方案&#xff0c;包括测试计划设计、脚本录制、测试执行、结果分析和报告生成等功…...

Zia和ChatGPT如何协同工作?

有没有集成ChatGPT的CRM系统推荐&#xff1f;Zoho CRM已经正式与ChatGPT集成。下面我们将从使用场景、使用价值和使用范围等方面切入讲述CRMAI的应用和作用。 Zia和ChatGPT如何协同工作&#xff1f; Zia和ChatGPT是不同的人工智能模型&#xff0c;在CRM中呈现出共生的关系。 …...

【位操作】——获取整数变量最低位为 1 的位置

获取整数变量最低位为 1 的位置 #define BIT_LOW_BIT(y) (((y)&BIT(0)) ? 0 : (((y)&BIT(1)) ? 1 : (((y)&BIT(2)) ? 2 : (((y)&BIT(3)) ? 3 : \(((y)&BIT(4)) ? 4 : (((y)&BIT(5)) ? 5 : (((y)&BIT(6)) ? 6 : (((y)&…...

gtest测试用例注册及自动化调度机制源代码流程分析

gtest的入门参见&#xff1a; 玩转Google开源C单元测试框架Google Test系列(gtest) gtest源码分析流程参见&#xff1a; gtest流程解析 测试用例注册流程分析要点&#xff1a;TEST_F宏替换、C静态成员的动态初始化。 自动化调度流程分析要点&#xff1a;UnitTest、UnitTestIm…...

IOS自动化测试环境搭建教程

目录 一、前言 二、环境依赖 1、环境依赖项 2、环境需求与支持 三、环境配置 1、xcode安装 2、Git安装 3、Homebrew安装&#xff08;用brew来安装依赖&#xff09; 4、npm和nodejs安装 5、libimobiledevice安装 6、idevicesinstaller安装 7、ios-deploy安装 8、Ca…...

常用API学习08(Java)

格式化 格式化指的是将数据按照指定的规则转化为指定的形式 。 那么为什么需要格式化&#xff1f;格式化有什么用&#xff1f; 以数字类为例&#xff0c;假设有一个比分牌&#xff0c;在无人得分的时候我们希望以&#xff1a;“00&#xff1a;00”的形式存在&#xff0c;那么…...

面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?

面试题-TS(八)&#xff1a;什么是装饰器&#xff08;decorators&#xff09;&#xff1f;如何在 TypeScript 中使用它们&#xff1f; 在TypeScript中&#xff0c;装饰器&#xff08;Decorators&#xff09;是一种用于增强代码功能的特殊类型声明。装饰器提供了一种在类、方法、…...

Jenkins 还可以支持钉钉消息通知?一个插件带你搞定!

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…...

7.ES使用

ES多条件查询 and , or这种的 ES模糊查询 like这种的 {"wildcard": {"title.keyword": {"value": "*宣讲*"}}}说明&#xff1a; title是要匹配的关键字段名称keyword是属性&#xff0c;表示匹配的是关键字信息&#xff0c;如果不用.ke…...

Web安全基础

1、HTML基础 什么是 HTML HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言&#xff0c;而是一种标记语言 (Markup language) 标记语言是一套标记标签 (Markup tag) HTML 使用标记标签来描述网页 总的来说&…...

jQueryAPI

文章目录 1.jQuery 选择器1.1 jQuery 基础选择器1.2 jQuery 层级选择器1.3 隐式迭代1.4 jQuery 筛选选择器1.5 jQuery 筛选方法1.6 jQuery 里面的排他思想1.7 链式编程 2.jQuery 样式操作2.1 操作 css 方法2.2 设置类样式方法2.3 类操作与className区别 3.jQuery 效果3.1 显示隐…...

如何将路径字符串数组(string[])转成树结构(treeNode[])?

原文链接&#xff1a;如何将路径字符串数组(string[])转成树结构(treeNode[])&#xff1f; 需求 这里的UI使用的是Element-Plus。 将一个路径字符串数组&#xff08;当然也可能是其他目标字符串数组&#xff09;&#xff0c;渲染成树。 /*source:/a/b/c/d/e/a/b/e/f/g/a/b/h/a…...

中国工程院院士陈晓红一行莅临麒麟信安调研

7月20日下午&#xff0c;中国工程院院士、湘江实验室主任、湖南工商大学党委书记陈晓红&#xff0c;湘江实验室副主任、湖南工商大学副校长刘国权&#xff0c;湘江实验室副主任、湖南工商大学党委组织部统战部常务副部长胡春华等领导一行莅临麒麟信安调研。麒麟信安董事长杨涛&…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...