移动手机截图,读取图片尺寸

这个代码的设计初衷是为了解决图片处理过程中的一些痛点。想象一下,我们都曾遇到过这样的情况:相机拍摄出来的照片、网络下载的图片,尺寸五花八门,大小不一。而我们又渴望将它们整理成一套拥有统一尺寸的图片,让它们更加美观、方便对比,甚至能够让人忍不住想为它们短暂的“尺寸统一”开个欢呼庆祝派对!

input默认读取 /storage/emulated/0/Pictures/Screenshots/Screenshot_20231001_132228.jpg 尺寸大小
输入错误就直接读取这个路径图片尺寸,
将和它相同尺寸的图片移动到 /storage/emulated/0/Pictures/图片要删除/
没有这个文件夹就新建那个我是要移动那个读渠道的尺寸,然后按照这个尺寸,移动这个文件夹下的这个相同的尺寸
优雅热诚幽默注释

代码就像是一位图片整理小能手,它的使命是帮助您从一大堆杂乱无章的图片中挑选出那些与您心仪的指定尺寸完全匹配的图片,并将它们统统移动到一个整洁有序的目标文件夹中。

所以,为了达成这个目标,我们编写了这段代码,将源文件夹中的图片逐个探索,并与您指定的图片尺寸进行一一对比。只要找到尺寸完全匹配的图片,我们就毫不犹豫地将其搬迁到目标文件夹中。这样一来,在整理图片时,您只需交给代码这个“小助手”,它会自动、细致地帮您完成这项繁琐的任务,让您省时省力,一举搞定!

咳咳,我尝试写一个优雅热诚幽默的注释版本:


from PIL import Image  # 导入PIL库,用于处理图片(因为机器也想变成梦工厂的缩小药水)
import os  # 导入os库,用于文件和目录操作(让我们来操作文件的世界吧!)
import shutil  # 导入shutil库,用于文件移动操作(我们要把文件从这里移到那里,就像魔术师一样!)
from tqdm import tqdm  # 导入tqdm库,用于显示进度条(进度条是你最可靠的盆友)
import imghdr  # 导入imghdr库,用于判断文件是否为图片类型(我们需要知道它是不是真的图片哦)# 判断文件是否为图片类型(如果它不是图片,那它就是一只假冒伪劣产品)
def is_image_file(file_path):return imghdr.what(file_path) is not None# 读取指定图片尺寸并存储到列表中(我们要知道图片的大小,才能做出更好的选择)
def get_image_size(image_path):try:image = Image.open(image_path)return image.sizeexcept FileNotFoundError:return None# 移动与指定图片尺寸相同的图片到目标文件夹(我们要找到和它一样大的伙伴,一起吃饭!)
def move_similar_images(source_folder, target_folder, size):# 创建目标文件夹(如果不存在),我们要给他找个家!if not os.path.exists(target_folder):os.makedirs(target_folder)# 遍历源文件夹中的所有文件,就像一个侦探一样搜寻线索!for filename in tqdm(os.listdir(source_folder)):file_path = os.path.join(source_folder, filename)if os.path.isfile(file_path) and is_image_file(file_path):image_size = get_image_size(file_path)if image_size is not None and image_size == size:# 移动相同尺寸的图片到目标文件夹,让它们团聚在一起!shutil.move(file_path, target_folder)# 指定文件夹路径和图片名称,我们要准确定位!
folder_path = '/storage/emulated/0/Pictures/Screenshots/'  # 源文件夹路径(从这里找)
image_name = 'Screenshot_20231001_132228.jpg'  # 指定的图片名称(我们要找的那张)# 读取指定图片的尺寸,看看它有多大才决定是不是我们要的那个!
image_path = os.path.join(folder_path, image_name)
image_size = get_image_size(image_path)
if image_size is None:print("找不到指定的图片文件。")  # 找不到的话,我们要告诉用户它去哪儿了!
else:print("指定图片尺寸大小:{}x{}".format(image_size[0], image_size[1]))  # 告诉用户图片有多大不会吓到他们!# 移动与指定图片尺寸相同的图片到目标文件夹,我们要把他们召集起来!target_folder = '/storage/emulated/0/Pictures/图片要删除/'move_similar_images(folder_path, target_folder, image_size)

同时,为了提升代码的易读性和处理效率,我们巧妙地运用了一些优秀的库函数。比如,PIL库是专门用于图片处理的神器,它帮助我们轻松应对图片的尺寸判断。而os库则在文件和路径操作上发挥了重要作用,shutil库则完成了文件和文件夹的移动工作,tqdm库更是加入了处理进度条的元素,让整个过程像是一场与时间赛跑的游戏。这些巧妙的设计和库函数的精妙应用,使得代码不仅功能强大,还增添了一丝人性化的趣味。

第2种方法:

# 导入 Python Imaging Library 库用于处理图片(好像这个库叫做 PIL 也可以)
from PIL import Image# 导入 os 库用于文件操作和路径操作(让我们来操作文件吧!)
import os# 导入 shutil 库用于移动文件和文件夹(我们要把图片移动到哪里呢?)
import shutil# 导入 tqdm 库用于展示进度条(进度条,让我们看得到代码进展了!)
from tqdm import tqdm# 判断文件是否为图片类型(我们只需要图片文件)
def is_image_file(file_path):# 设置一个包含合法扩展名的列表(哪些扩展名是图片类型的呢?)valid_extensions = ['.jpg', '.jpeg', '.png', '.gif']# 获取文件扩展名并转换成小写格式(因为文件扩展名大小写不一定,我们把它都转换成小写来比较)ext = os.path.splitext(file_path)[1].lower()# 判断文件扩展名是否在合法扩展名列表中(判断一下这个文件是不是图片类型)return ext in valid_extensions# 获取指定图片尺寸(我们需要知道限定的图片尺寸)
def get_image_size(image_path):try:# 打开图片并获取其大小(打开图片文件,获取它的大小)image = Image.open(image_path)# 返回图片的尺寸大小return image.sizeexcept FileNotFoundError:# 如果文件不存在,则返回 None(如果文件不存在,我们就返回空)return None# 移动与指定图片尺寸相同的图片到目标文件夹(让我们把符合要求的图片移动到目标文件夹吧!)
def move_similar_images(source_folder, target_folder, size):# 如果目标文件夹不存在,则创建它(万一目标文件夹不见了呢?)if not os.path.exists(target_folder):os.makedirs(target_folder)# 使用 os.walk() 遍历源文件夹下的所有子文件夹和文件(我们要找到那些符合要求的图片文件)for root, dirs, files in os.walk(source_folder):for filename in tqdm(files):# 构造文件路径(得到图片文件的完整路径)file_path = os.path.join(root, filename)# 如果文件是图片类型,则进一步处理(我们只需要处理图片类型的文件)if is_image_file(file_path):# 获取图片尺寸并与指定尺寸比较(看看这张图片的尺寸是不是我们想要的)image_size = get_image_size(file_path)if image_size is not None and image_size == size:# 将相同尺寸的图片移动到目标文件夹中(好了,符合要求的图片就可以移动到目标文件夹了)shutil.move(file_path, target_folder)# 指定源文件夹路径和目标文件夹路径(我们需要知道源文件夹和目标文件夹的位置)
source_folder = '/storage/emulated/0/Pictures/Screenshots/'
target_folder = '/storage/emulated/0/Pictures/图片要删除/'# 图片名称和路径(我们需要提供一张指定尺寸的图片,来找到符合要求的图片)
image_name = 'Screenshot_20231001_132228.jpg'
image_path = os.path.join(source_folder, image_name)# 获取指定图片尺寸(我们需要知道限定的图片尺寸)
image_size = get_image_size(image_path)
if image_size is None:# 如果获取不到指定图片,则打印信息(如果找不到指定的图片文件,那就告诉我们吧!)print("找不到指定的图片文件。")
else:# 打印指定图片的尺寸大小(好的,我们取得了指定图片的尺寸,让我们看看它的大小吧!)print("指定图片尺寸大小:{}x{}".format(image_size[0], image_size[1]))# 移动与指定图片尺寸相同的图片到目标文件夹(那么现在,符合要求的图片就可以移动到目标文件夹啦!)move_similar_images(source_folder, target_folder, image_size)

这次的注释能够让理解代码的逻辑和各个函数的作用

一个处理图片的实例,我们筛选出与指定图片尺寸相同的图片,并将它们移动到指定的目标文件夹中,用于整理图片集合,只保留指定尺寸的图片,使图片更加整洁和有序。

为什么要有这个代码呢?

相册整理:记得有一次旅行,我拍了很多照片,各种尺寸都有。为了方便找到那些美好瞬间,我挑出了同样尺寸的照片,放在一个文件夹里,回忆着那段美好的旅程。
统一尺寸:有一次,我为了制作一个关于我成长的视频,需要将各个阶段的照片调整成相同的尺寸。当我看到那些不同年代、同样尺寸的照片时,心中涌起一股感慨。
数据分析:曾在一个展览中,我看到研究人员通过筛选出相同尺寸的照片进行数据分析,从而揭示出一些有趣的规律。那一刻,我感叹科技的神奇,也为这些默默付出的研究人员点赞。

为了实现上述功能,我们编写了这个代码。它通过遍历源文件夹中的所有图片文件,并逐个判断它们的尺寸是否与指定图片的尺寸相同,

如果相同则将其移动到目标文件夹中。

这样做的好处是可以帮助我们自动化完成这个任务,提高处理效率。



同时,在代码中使用了一些常用的库函数,如PIL库用于处理图片,os库用于文件和路径操作,shutil库用于移动文件和文件夹,tqdm库用于展示处理进度条。这些库函数的使用可以简化我们的开发工作,并增加了代码的可读性。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 调教指南:从 PDF 提取标题并保存

一、请使用python编写一段代码,使用pymupdf包从pdf中提取标题,保存标题名称和页数。 我没有加任何的答案提示,看看 GPT 如何反应。它应该是知道 PDF 没有任何语义信息,一切标题或者正文全是文本框。 好的,以下是使用py…

零基础Linux_9(进程)环境变量+进程地址空间+进程创建fork

目录 1. 环境变量 1.1 环境变量基本概念 1.2 环境变量PATH 1.3 环境变量HOME和SHELL 1.4 获取环境变量(main函数参数) 1.4.1 main函数第三个参数 1.4.2 设置普通变量和环境变量 1.4.3 main函数前两个参数 2. 进程地址空间 2.1 验证进程地址空…

PHP8的数据封装(数据隐藏)-PHP8知识详解

面向对象的特点之一就是封装性,也就是数据封装,也被称为数据隐藏。 php8通过限制访问权限来实现数据的封装性,这里用到了public、private、protected、static和final几个关键字。下面来介绍前3个。 1.、public(公共成员&#xf…

CSP-J第二轮试题-2021年-3题

文章目录 参考:总结 [CSP-J 2021] 网络连接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 样例 #4样例输入 #4样例输出 #4 提示答案1答案2 现场真题注意事项 参考: https://www…

2022年全球一次能源消费量:石油消耗量持续增加达190.69百亿亿焦耳,亚太地区消费量居首位[图]

一次性能源是指从自然界取得未经改变或转变而直接利用的能源。如原煤、原油、天然气、水能、风能、太阳能、海洋能、潮汐能、地热能、天然铀矿等。一次性能源又分为可再生能源和不可再生能源,前者指能够重复产生的天然能源,包括太阳能、风能、潮汐能、地…

网络知识点之—PPPoE

本文章已收录至《网络》专栏,点进右上角专栏图标可访问本专栏 PPPoE(Point-to-Point Protocol Over Ethernet),指以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet&a…

机器学习的超参数 、训练集、归纳偏好

一、介绍 超参数(Hyperparameters)和验证集(Validation Set)是机器学习中重要的概念,用于调整模型和评估其性能。 超参数: 超参数是在机器学习模型训练过程中需要手动设置的参数,而不是从数据…

C/C++与汇编混合编程

1. C/C调用汇编 C/C想调用汇编代码必须要注意名称修饰的问题 名称修饰(name decoration): 一种标准的C/C编译技术, 通过添加字符来修改函数名, 添加的字符指明了每个函数参数的确切类型。主要是为了支持函数重载, 但对于汇编来说其问题在于, C/C编译器让链接器去找被修饰过的名…

K8S-EverNote同步

Node污点 释义看文档就好 https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/taint-and-toleration/ 污点是Node的属性 容忍度是Pod的属性 用来标记各自特征的,通常协同工作。 举个例子, 一个Node的污点 kubectl taint nodes node1 key1v…

算法练习10——数组为空的最少操作次数

LeetCode 100032 使数组为空的最少操作次数 给你一个下标从 0 开始的正整数数组 nums 。 你可以对数组执行以下两种操作 任意次 : 从数组中选择 两个 值 相等 的元素,并将它们从数组中 删除 。 从数组中选择 三个 值 相等 的元素,并将它们从数…

cadence SPB17.4 S032 - 使用room来放置元件

文章目录 cadence SPB17.4 S032 - 使用room来放置元件概述笔记在orcad中设置子原理图的ROOM号码在空的Allegro工程中, 放入板框在allegro中建立room备注补充 - ROOM还得留着END cadence SPB17.4 S032 - 使用room来放置元件 概述 如果在allegro中直接手工或自动放置元件, 放好…

C++ —— 单机软件加入Licence许可权限流程(附详细流程图、详细代码已持续更新..)

单机版许可证简介 笼统的说:实现一个生成授权Lic文件应用程序(我们使用),生成的Lic文件给应用程序(客户使用)启动时读取一下对比加密后的字符串或自定义格式的密钥判断是否正确。 单机版许可证执行流程 第一级比对:发布的加密许可证文件,该加密许可证文件仅可用使用的软…

计算机网络各层设备

计算机网络通常被分为七层,每一层都有对应的设备。以下是各层设备的简要介绍: 物理层(Physical Layer):负责传输二进制数据位流的物理媒体和设备,例如网线、光纤、中继器、集线器等。 数据链路层&#xf…

LeNet网络复现

文章目录 1. LeNet历史背景1.1 早期神经网络的挑战1.2 LeNet的诞生背景 2. LeNet详细结构2.1 总览2.2 卷积层与其特点2.3 子采样层(池化层)2.4 全连接层2.5 输出层及激活函数 3. LeNet实战复现3.1 模型搭建model.py3.2 训练模型train.py3.3 测试模型test…

【网络协议】传输层协议

目录 传输层协议 1.传输层的两个协议 1.1TCP和UDP的应用场景 1.2传输层协议和应用层协议的关系 2.TCP和UDP的对比(重点) (1)无连接的UDP和面向连接的TCP (2)UDP和TCP对单播、多播和广播的支持情况 (3)UDP和TCP对应用层报文的处理 (4)UDP和TCP对数…

React实现多图片预览功能、预览图上下张切换(实战示例)

前言 在React项目中,展示和预览多张图片是一种常见的需求。本篇帖子将介绍如何使用React和antd库来实现这一功能,并探讨如何在预览模态框中切换到前一张或后一张图片。 背景 我们将以一个OCR图像列表展示的示例来演示代码的运用。假设我们有一个OCR系…

Linux系统编程系列之进程间通信-信号量组

一、什么是信号量组 信号量组是信号量的一种, 是system-V三种IPC对象之一,是进程间通信的一种方式。 二、信号量组的特性 信号量组不是用来传输数据的,而是作为“旗语”,用来协调各进程或者线程工作的。信号量组可以一次性在其内…

【LeetCode】滑动窗口妙解无重复字符的最长子串

Problem: 3. 无重复字符的最长子串 文章目录 思路算法原理分析暴力枚举 哈希表滑动窗口 复杂度Code 思路 首先我们来分析一下本题的思路 如果读者有看过 长度最小的子数组 的话就可以清楚这个子串其实和子数组是一个道理,都是 连续的一段区间但是呢它们本质上还是存…

应用架构的演进:亚马逊的微服务实践

当你在亚马逊上购物时,或许不会想到,你看到的这个购物网站,其背后技术架构经历了什么样的变迁与升级。 还记得上世纪 90 年代,那个只卖书的网上书店吗?那时的亚马逊,不过是一个架构简单的网站,所有的功能都堆积在一个庞大的软件堡垒里。随着更多业务的增加、更新和迭代,这个软…

【小程序 - 基础】页面导航、页面事件、生命周期、WXS脚本_04

目录 一、页面导航 1. 什么是页面导航 2. 小程序中实现页面导航的两种方式 2.1 声明式导航 2.1.1 导航到 tabBar 页面 2.1.2 导航到非 tabBar 页面 2.1.3 后退导航 2.2 编程式导航 2.2.1 导航到 tabBar 页面 2.2.2 导航到非 tabBar 页面 2.2.3 后退导航 2.3. 导航…