移动手机截图,读取图片尺寸
这个代码的设计初衷是为了解决图片处理过程中的一些痛点。想象一下,我们都曾遇到过这样的情况:相机拍摄出来的照片、网络下载的图片,尺寸五花八门,大小不一。而我们又渴望将它们整理成一套拥有统一尺寸的图片,让它们更加美观、方便对比,甚至能够让人忍不住想为它们短暂的“尺寸统一”开个欢呼庆祝派对!
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库用于展示处理进度条。这些库函数的使用可以简化我们的开发工作,并增加了代码的可读性。
相关文章:
移动手机截图,读取图片尺寸
这个代码的设计初衷是为了解决图片处理过程中的一些痛点。想象一下,我们都曾遇到过这样的情况:相机拍摄出来的照片、网络下载的图片,尺寸五花八门,大小不一。而我们又渴望将它们整理成一套拥有统一尺寸的图片,让它们更…...
服务器应用程序不可用的原因是什么引起的
服务器应用程序不可用的原因是什么引起的 服务器应用程序不可用的原因是什么引起的?其实服务器应用程序不可用可能是由多种原因引起的。主要包括软件故障、网络问题、硬件故障、安全问题、配置错误、容量不足、数据库问题等,具体详细服务器应用程序不可用的原因如下…...
使用SPY++查看窗口信息去排查客户端UI软件问题
目录 1、使用SPY++查看窗口的信息 2、使用SPY++查看某些软件UI窗口用什么UI组件实现的...

Flink CDC MySQL同步MySQL错误记录
1、启动 Flink SQL [appuserwhtpjfscpt01 flink-1.17.1]$ bin/sql-client.sh2、新建源表 问题1:Encountered “(” 处理方法:去掉int(11),改为int Flink SQL> CREATE TABLE t_user ( > uid int(11) NOT NULL AUTO_INCREMENT COMME…...

深入了解 Linux 中的 AWK 命令:文本处理的瑞士军刀
简介 在Linux和Unix操作系统中,文本处理是一个常见的任务。AWK命令是一个强大的文本处理工具,专门进行文本截取和分析,它允许你在文本文件中查找、过滤、处理和格式化数据。本文将深入介绍Linux中的AWK命令,让你了解其基本用法和…...
【RuoYi项目分析】网关的AuthFilter完成“认证”,注意是认证而不是权限
文章目录 1. 功能介绍2. AuthFilter的配置3. AuthFilter实现分析4. 资料参考 过滤器的功能是检验经过网关的每一个请求,检查 token 中的信息是否有效。 注意是“认证检查”,而不是“权限” 1. 功能介绍 1、在用户完成登录后,程序会把用户相关…...
excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中
excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中 import pandas as pd import ositems os.listdir("./") sheetname"" for item in items:if item.__contains__(xls):dfpd.read_exc…...

IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了
找到IIS管理器启动程序的所在位置 并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性,找到其位置 管理员模式打开cmd命令行,并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因:由于某…...

使用VBA实现快速模糊查询数据
实例需求:基础数据保存在Database工作表中,如下图所示。 基础数据有37个字段,上图仅展示部分字段内容,下图中黄色字段为需要提取的数据字段。 在Search工作表B1单元格输入查询关键字Title和Genre字段中搜索关键字,包…...
spring boot flowable多人前加签
1、前加签插件 package com.xxx.flowable.cmd;import com.xxx.auth.security.user.SecurityUser; import com.xxx.commons.ApplicationContextHolder; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.co…...

结构体运算符重载
1.降序 struct Point{int x, y;//重载比较符bool operator < (const Point &a) const{return x > a.x;//当前元素大时,是降序} };2.升序 struct Point{int x, y;//重载比较符 // bool operator < (const Point &a) const{ // return x…...
幽默直观的文档作者注释
注释是程序中非常重要的一部分,在不同的编程语言中,注释的风格和语言描述会有所不同。以下是一些常用的注释风格和语言描述: 直观注释:这种注释使用简洁、明了的语言,帮助读者快速地理解代码。例如,代码中…...

前端开发网站推荐
每个人都会遇见那么一个人,永远无法忘却,也永远不能拥有。 以下是一些可以用来查找和比较前端框架的推荐网站: JavaScript框架比较: 这些网站提供了对不同JavaScript框架和库的详细比较和评估。 JavaScripting: 提供了大量的JavaS…...
【C语言】通讯录管理系统(保姆级教程+内含源码)
C系列文章目录 目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联…...

python自动解析301、302重定向链接
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下: import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…...
【未解决问题】opencv 交叉编译 ffmpeg选项始终为NO
opencv 打不开视频的原因 在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 ffmpeg 造成的。 解决opencv源代码编译找不到ffmpeg-CSDN博客 交叉编译 ffmpeg 尝试了一天还是第二个博客…...

Python实用技术二:数据分析和可视化(2)
目录 一,多维数组库numpy 1,操作函数: 2,numpy数组元素增删 1)添加数组元素 2)numpy删除数组元素 3)在numpy数组中查找元素 4)numpy数组的数学运算 3,numpy数…...

24Hibench
1. Hibench 官网 HiBench is a big data benchmark suite that helps evaluate different big data frameworks in terms of speed, throughput and system resource utilizations. It contains a set of Hadoop, Spark and streaming workloads, including Sort, WordCou…...
VC++父进程交互式操作子进程标准输入输出
父进程接管子进程的标准输入输出和错误,实现对子进程的交互操作。比如子进程是一个类似mysql这种可以交互的命令,执行操作后输出结果,父进程根据结果分析决定执行下一步的命令,从而替代人工的输入。 通过父进程创建子进程,使用管道重定向子进程的输入输出错误可以实现 在 …...

一步一招,教你如何制作出成功的优惠促销微传单
在当今的数字化时代,几乎所有的事情都可以在互联网上完成,包括制作宣传单。有很多在线工具可以帮助我们轻松制作出精美的商场促销宣传单。下面就以乔拓云为例,详细介绍如何简单几步制作出让人眼前一亮的商场促销宣传单。 1. 注册并登录乔拓云…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...