编程小白尝试用ChatGPT做点小工具(自动播放文件夹照片)

查看 51|回复 4
作者:kkk013   
我:写一个程序,其功能是检索本文件夹以及子文件夹的图片,然后逐一按顺序播放
ChatGPT:要实现这个功能,你可以使用Python编程语言,并结合一些库来帮助你完成任务。以下是一个简单的Python脚本,它使用了`os`库来遍历文件夹和子文件夹,使用`PIL`库(Pillow)来处理图片,以及使用`cv2`(OpenCV)来播放图片。
首先,确保你已经安装了`Pillow`和`OpenCV`库。如果没有安装,可以通过以下命令安装:
[Python] 纯文本查看 复制代码```bash
pip install pillow opencv-python
```
然后,你可以使用以下Python脚本来实现你的需求:
[Python] 纯文本查看 复制代码```python
import os
from PIL import Image
import cv2
import numpy as np
# 设置图片文件夹路径
folder_path = './'  # 当前文件夹
# 获取所有图片文件
image_files = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
            image_files.append(os.path.join(root, file))
# 按文件名排序
image_files.sort()
# 创建一个窗口来显示图片
cv2.namedWindow('Image Viewer', cv2.WINDOW_NORMAL)
# 逐一播放图片
for image_path in image_files:
    # 使用Pillow打开图片
    img = Image.open(image_path)
    # 将图片转换为OpenCV格式
    img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    # 显示图片
    cv2.imshow('Image Viewer', img_cv)
    # 等待按键,然后关闭窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
print("图片播放完成。")
```
这个脚本会遍历指定文件夹及其所有子文件夹,找到所有图片文件(支持的格式包括`.png`, `.jpg`, `.jpeg`, `.bmp`, `.gif`),然后逐一打开并显示在屏幕上。每张图片显示时,程序会等待用户按下任意键后才关闭窗口并显示下一张图片。
请确保你已经安装了必要的库,并将`folder_path`变量设置为你想要检索的文件夹路径。运行脚本后,它将自动开始播放图片。

文件夹, 图片

kkk013
OP
  
我:我如何运行它
ChatGPT:要运行上述Python脚本,请按照以下步骤操作:
1. **安装Python**:
   确保你的计算机上安装了Python。你可以从Python官网下载并安装最新版本的Python:[https://www.python.org/downloads/](https://www.python.org/downloads/)
2. **安装必要的库**:
   在运行脚本之前,你需要安装`Pillow`和`OpenCV`库。打开命令提示符(Windows)或终端(macOS/Linux),然后输入以下命令:
  [Python] 纯文本查看 复制代码 ```bash
   pip install pillow opencv-python
   ```
   如果你使用的是Python 3,可能需要使用`pip3`:
  [Python] 纯文本查看 复制代码 ```bash
   pip3 install pillow opencv-python
   ```
3. **创建并编辑脚本**:
   使用文本编辑器(如记事本、VSCode、Sublime Text等)创建一个新的Python文件,将上述脚本复制粘贴到文件中。将文件保存为`.py`扩展名,例如`image_viewer.py`。
4. **运行脚本**:
   打开命令提示符(Windows)或终端(macOS/Linux),导航到保存脚本的文件夹。你可以使用`cd`命令来改变目录。例如:
  [Python] 纯文本查看 复制代码 ```bash
   cd path/to/your/script
   ```
   然后,运行脚本:
[Python] 纯文本查看 复制代码
   ```bash
   python image_viewer.py
   ```
   如果你使用的是Python 3,可能需要使用`python3`:
[Python] 纯文本查看 复制代码  ```bash
   python3 image_viewer.py
   ```
   脚本将开始运行,遍历指定文件夹及其子文件夹中的图片,并逐一显示它们。每张图片显示时,你需要按下任意键来关闭窗口并显示下一张图片。
请确保你的Python环境设置正确,并且脚本文件的路径和名称正确无误。如果你遇到任何问题,可以检查Python和库是否正确安装,或者查看命令行输出的错误信息以获取更多帮助。
kkk013
OP
  
我:再添加一段代码,以确保每张图片相同大小显示
ChatGPT:要确保每张图片以相同的大小显示,你可以在显示图片之前调整它们的尺寸。以下是如何修改之前的脚本,以便每张图片都调整为相同的大小(例如,宽度为800像素,高度按比例缩放):
```python
import os
from PIL import Image
import cv2
import numpy as np
# 设置图片文件夹路径
folder_path = './'  # 当前文件夹
# 设置输出图片的尺寸
output_width = 800
# 获取所有图片文件
image_files = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
            image_files.append(os.path.join(root, file))
# 按文件名排序
image_files.sort()
# 创建一个窗口来显示图片
cv2.namedWindow('Image Viewer', cv2.WINDOW_NORMAL)
# 逐一播放图片
for image_path in image_files:
    # 使用Pillow打开图片
    img = Image.open(image_path)
    # 调整图片大小
    aspect_ratio = img.width / img.height
    output_height = int(output_width / aspect_ratio)
    resized_img = img.resize((output_width, output_height), Image.ANTIALIAS)
    # 将图片转换为OpenCV格式
    img_cv = cv2.cvtColor(np.array(resized_img), cv2.COLOR_RGB2BGR)
    # 显示图片
    cv2.imshow('Image Viewer', img_cv)
    # 等待按键,然后关闭窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
print("图片播放完成。")
```
在这个修改后的脚本中,我们添加了以下步骤:
1. 定义了一个变量`output_width`,用于设置输出图片的宽度。
2. 在打开图片后,计算了图片的宽高比,并根据宽度设置了相应的高度,以保持图片的原始宽高比。
3. 使用`Image.resize()`方法调整图片大小,其中`Image.ANTIALIAS`参数确保了高质量的缩放。
这样,无论原始图片的尺寸如何,它们都将以统一的宽度(在此例中为800像素)显示,同时保持其原始宽高比。
运行这个脚本时,请确保你已经安装了必要的库,并且脚本文件的路径和名称正确无误。如果你想要检索的图片文件夹不是当前文件夹,请修改`folder_path`变量为相应的路径。
kkk013
OP
  
我:Traceback (most recent call last):
  File "D:\work\*\image_viewer.py", line 32, in
    resized_img = img.resize((output_width, output_height), Image.ANTIALIAS)
                                                            ^^^^^^^^^^^^^^^
AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'
ChatGPT:抱歉给您带来困扰。在较新版本的 Pillow(PIL 的现代版本)中,`ANTIALIAS` 已经被弃用。您应该使用 `Image.LANCZOS` 或 `Image.BICUBIC` 等其他插值方法来代替。以下是修正后的代码:
```python
import os
from PIL import Image
import cv2
import numpy as np
# 设置图片文件夹路径
folder_path = './'  # 当前文件夹
# 设置输出图片的尺寸
output_width = 800
# 获取所有图片文件
image_files = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
            image_files.append(os.path.join(root, file))
# 按文件名排序
image_files.sort()
# 创建一个窗口来显示图片
cv2.namedWindow('Image Viewer', cv2.WINDOW_NORMAL)
# 逐一播放图片
for image_path in image_files:
    # 使用Pillow打开图片
    img = Image.open(image_path)
    # 调整图片大小
    aspect_ratio = img.width / img.height
    output_height = int(output_width / aspect_ratio)
    resized_img = img.resize((output_width, output_height), Image.LANCZOS)
    # 将图片转换为OpenCV格式
    img_cv = cv2.cvtColor(np.array(resized_img), cv2.COLOR_RGB2BGR)
    # 显示图片
    cv2.imshow('Image Viewer', img_cv)
    # 等待按键,然后关闭窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
print("图片播放完成。")
```
在这个修正后的代码中,我将 `Image.ANTIALIAS` 替换为 `Image.LANCZOS`,这是一种高质量的插值方法,适用于缩小图片。如果您需要不同的插值方法,可以替换 `Image.LANCZOS` 为其他可用的插值方法,如 `Image.BICUBIC` 或 `Image.BILINEAR`。
请确保您的 Pillow 库是最新版本,以便使用这些插值方法。如果您的库不是最新版本,可以通过运行 `pip install --upgrade pillow` 来更新它。
再次运行脚本时,应该不会再出现 `AttributeError` 了。如果还有其他问题,请随时告诉我。
kkk013
OP
  
我:可以添加一段代码,实现定时自动播放下一张图片吗
ChatGPT:要实现定时自动播放下一张图片,您可以使用 OpenCV 的 `cv2.waitKey()` 函数,并设置一个较短的时间间隔(以毫秒为单位)。以下是如何修改脚本来实现这一功能:
```python
import os
from PIL import Image
import cv2
import numpy as np
# 设置图片文件夹路径
folder_path = './'  # 当前文件夹
# 设置输出图片的尺寸
output_width = 800
# 获取所有图片文件
image_files = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
            image_files.append(os.path.join(root, file))
# 按文件名排序
image_files.sort()
# 创建一个窗口来显示图片
cv2.namedWindow('Image Viewer', cv2.WINDOW_NORMAL)
# 逐一播放图片
for image_path in image_files:
    # 使用Pillow打开图片
    img = Image.open(image_path)
    # 调整图片大小
    aspect_ratio = img.width / img.height
    output_height = int(output_width / aspect_ratio)
    resized_img = img.resize((output_width, output_height), Image.LANCZOS)
    # 将图片转换为OpenCV格式
    img_cv = cv2.cvtColor(np.array(resized_img), cv2.COLOR_RGB2BGR)
    # 显示图片
    cv2.imshow('Image Viewer', img_cv)
    # 设置定时自动播放下一张图片的时间间隔(例如,2秒)
    time_interval = 2000  # 2000毫秒 = 2秒
    # 等待时间间隔,然后关闭窗口
    if cv2.waitKey(time_interval) & 0xFF == ord('q'):  # 按下 'q' 键退出循环
        break
    cv2.destroyAllWindows()
print("图片播放完成。")
```
在这个修改后的脚本中,我添加了以下内容:
1. 在 `cv2.waitKey()` 函数中设置了一个时间间隔 `time_interval`,这里是 2000 毫秒(即 2 秒)。这意味着每张图片将显示 2 秒。
2. 添加了一个条件判断,如果用户按下 'q' 键,则退出循环,停止播放图片。
请注意,`cv2.waitKey()` 返回的是按键的 ASCII 码。通过 `& 0xFF` 可以确保只取最低的 8 位,这是为了兼容不同的操作系统。`ord('q')` 返回 'q' 键的 ASCII 码。
运行这个脚本时,每张图片将自动显示 2 秒,然后切换到下一张。如果用户想要停止播放,可以按下 'q' 键。
确保您的脚本文件路径和名称正确无误,并且您已经安装了必要的库。如果您的图片文件夹不是当前文件夹,请修改 `folder_path` 变量为相应的路径。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部