python图片九宫格图片处理

简介: 本篇文章介绍了一个Python项目的实现,项目能够处理图片并将其组合成九宫格或四宫格,同时还具备音乐播放功能,对于初学者来说是一个可以进行实战学习的初级项目。


前言

版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。              

原文首发链接:https://blog.csdn.net/weixin_72543266/article/details/131700944

      在本文中,也刚好到假期了,为了处理假期出去玩的图片开始第二个Python实战项目实战开始学习和使用,希望能对像我一样的初学者有所帮助。

      本项目为本人第二次编写的第一个exe文件,作为自己的学习笔记,如有可改进的地方,望各为大佬指正,感谢!

一、本次学习须知

       (1)本项目相比第一个项目多了制作ui方面的模块,具有一定的python基础以及能正常使用库即可进行学习,当然本次也有关于如何进行python项目打包相关的教学,初学者也可进行阅读并学习。

       (2)本项目分为代码块进行制作笔记与学习。

二、项目学习

1.导入库

image.gif

解读:

  1. import tkinter as tk:导入tkinter模块,并将其重命名为tk,用于创建GUI界面。
  2. from tkinter import filedialog, messagebox:从tkinter模块中导入filedialogmessagebox,用于文件对话框和消息框。
  3. import os:导入os模块,用于操作文件和目录。
  4. import pygame.mixer:导入pygame.mixer模块,用于音频播放。
  5. from PIL import ImageTk, Image:从PIL模块中导入ImageTkImage类,用于处理和显示图片。

2.对图片进行九宫格图片分组处理

image.gif

解读:

  1. def group_remaining_images(images, num_images)::定义了一个名为group_remaining_images的函数,它接受两个参数:images表示图片列表,num_images表示图片数量。
  2. groups = []:创建一个空列表groups,用于保存图片分组。
  3. while num_images >= 9::当剩余图片数量大于等于9时,执行循环。
  4. group = images[:9]:从输入的图片列表中获取前9张图片作为一个分组。
  5. groups.append(group):将这个分组添加到分组列表groups中。
  6. images = images[9:]:从输入的图片列表中移除已经分组的9张图片。
  7. num_images -= 9:更新剩余图片数量,减去已经分组的图片数量。
  8. if num_images > 0::如果剩余图片数量大于0,执行以下代码。
  9. group = images[:num_images]:获取剩余的图片作为一个分组。
  10. groups.append(group):将这个分组添加到分组列表groups中。
  11. return groups:返回图片分组列表groups

总结:

       (1)使用一个循环来将图片分成多个分组,每个分组包含至多9张图片。

(2)最后将剩余的图片数量不满9张的部分作为一个分组。这个函数可以用于对图片进行分组操作。

3.文件选择:

解读 :

  1. def select_folder(entry)::定义了一个名为 select_folder 的函数,它接受一个参数 entry ,表示一个文本框。
  2. folder_path = filedialog.askdirectory():弹出文件夹选择对话框,并获取用户所选文件夹的路径。
  3. entry.delete(0, 'end'):清空文本框中的内容,将其初始化为空。
  4. entry.insert(0, folder_path):将所选文件夹路径插入到文本框中的第一个位置,即将路径显示在文本框中。

总结:

        (1)通过文件对话框弹出文件夹选择对话框,用户在对话框中选择文件夹后,将文件夹路径显示在给定的文本框中。

       (2)这个函数可以用于在GUI界面中实现选择文件夹的功能。

4.对图片进行组成九宫格图片处理:

image.gif

解读:

  1. def process_images(input_folder_entry, output_folder_entry1)::定义了一个名为 process_images 的函数,它接受两个参数 input_folder_entryoutput_folder_entry1 ,表示输入文件夹和输出文件夹的文本框。
  2. input_folder = input_folder_entry.get():获取输入文件夹路径的文本框内容。
  3. output_folder = output_folder_entry1.get():获取输出文件夹路径的文本框内容。
  4. if not os.path.isdir(input_folder)::判断输入的文件夹路径是否有效。
  5. messagebox.showerror("错误", "输入文件夹路径无效."):如果输入文件夹路径无效,显示错误消息对话框,提示输入文件夹路径无效。
  6. if not os.path.isdir(output_folder)::判断输出的文件夹路径是否存在。
  7. os.makedirs(output_folder):如果输出的文件夹路径不存在,尝试创建输出文件夹。
  8. messagebox.showerror("错误", "无法创建输出文件夹."):如果无法创建输出文件夹,显示错误消息对话框,提示无法创建输出文件夹。
  9. images = [filename for filename in os.listdir(input_folder) if filename.endswith('.jpg') or filename.endswith('.png')]:列出输入文件夹中所有以 .jpg.png 结尾的文件,并存储到一个列表中。
  10. num_images = len(images):计算图像文件的数量,即列表中元素的数量。
  11. if num_images == 0::判断图片文件的数量是否为0。
  12. messagebox.showerror("错误", "输入文件夹中没有图片文件."):如果图片文件的数量为0,显示错误消息对话框,提示输入文件夹中没有图片文件。
  13. groups = group_remaining_images(images, num_images):将图片文件分组。
  14. for i, group in enumerate(groups)::遍历每个图片组。
  15. new_image = Image.new('RGB', (600, 600)):创建一个新的RGB图片,大小为600x600。
  16. for j, image in enumerate(group)::遍历当前图片组中的每张图片。
  17. image_path = os.path.join(input_folder, image):获取图片的完整路径。
  18. img = Image.open(image_path):打开图片。
  19. img = img.resize((200, 200)):将图片调整为200x200大小。
  20. col = j % 3:计算图片在新图片中的列数。
  21. row = j // 3:计算图片在新图片中的行数。
  22. new_image.paste(img, (col * 200, row * 200)):将调整后的图片粘贴到新图片上。
  23. output_image_path = os.path.join(output_folder, f"九宫格图片_{i}.jpg"):构造输出图片的文件路径。
  24. new_image.save(output_image_path):保存新图片。
  25. messagebox.showinfo("完成", "图片处理完成."):显示信息消息对话框,提示图片处理完成。

总结:

       (1)实现了对输入文件夹中的图片进行处理,根据九宫格的规则将图片生成新的九宫格图片,并保存到输出文件夹中。

       (2)它还包括了错误处理和消息提示的功能。

5.对图片进行四宫格图片分组处理:

image.gif

解读:

  1. def group_remaining_images_4(images, num_images)::定义了一个名为group_remaining_images_4的函数,它接受两个参数:images表示图片列表,num_images表示图片数量。
  2. groups = []:创建一个空列表groups,用于保存图片分组。
  3. while num_images >= 4::当剩余图片数量大于等于4时,执行循环。
  4. group = images[:4]:从输入的图片列表中获取前4张图片作为一个分组。
  5. groups.append(group):将这个分组添加到分组列表groups中。
  6. images = images[4:]:从输入的图片列表中移除已经分组的4张图片。
  7. num_images -= 4:更新剩余图片数量,减去已经分组的图片数量。
  8. if num_images > 0::如果剩余图片数量大于0,执行以下代码。
  9. group = images[:num_images]:获取剩余的图片作为一个分组。
  10. groups.append(group):将这个分组添加到分组列表groups中。
  11. return groups:返回图片分组列表groups

总结:

(1)使用一个循环来将图片分成多个分组,每个分组包含至多4张图片。

(2)最后将剩余的图片数量不满4张的部分作为一个分组。这个函数可以用于对图片进行分组操作。

6.对图片进行组成四宫格图片处理:

image.gif

解读:

  1. 定义一个名为process_images2的函数,它接受两个参数input_folder_entryoutput_folder_entry2。这个函数用于处理四宫格图片。
  2. 通过input_folder_entry.get()方法获取输入文件夹路径。
  3. 通过output_folder_entry2.get()方法获取输出文件夹路径。
  4. 检查输入文件夹路径是否为一个有效的文件夹目录。
  5. 如果输入文件夹路径无效,使用messagebox.showerror()函数显示一个错误消息对话框,提示输入文件夹路径无效,并返回函数。
  6. 检查输出文件夹路径是否为一个有效的文件夹目录。
  7. 如果输出文件夹路径无效,尝试使用os.makedirs()函数创建输出文件夹。
  8. 如果创建输出文件夹发生错误,使用messagebox.showerror()函数显示一个错误消息对话框,提示无法创建输出文件夹,并返回函数。
  9. 创建一个列表images,其中包含输入文件夹中所有以.jpg.png结尾的图片文件名。
  10. 获取列表images中的图片文件数量,赋值给变量num_images
  11. 如果图片文件数量为0,使用messagebox.showerror()函数显示一个错误消息对话框,提示输入文件夹中没有图片文件,并返回函数。
  12. 使用group_remaining_images_4()函数将图片文件分组,每组包含4个图片文件,返回一个列表groups
  13. 使用enumerate()函数对列表groups进行迭代,同时获取索引和每个分组。
  14. 创建一个新的RGB模式的图片,大小为600x600,赋值给变量new_image
  15. 对于每个分组中的每个图片,依次执行以下操作:
  • 构造图片的完整路径,使用os.path.join()函数将输入文件夹路径和图片文件名拼接起来。
  • 使用Image.open()函数打开图片文件,赋值给变量img
  • 将图片调整为300x300大小,使用img.resize()函数。
  • 根据图片在分组中的索引计算图片在新图片中的位置,使用取余运算符%和整除运算符//
  • 将调整大小后的图片粘贴到新图片的指定位置,使用new_image.paste()函数。

   16.构造输出图片文件的完整路径,使用os.path.join()函数将输出文件夹路径和文件名拼接起      来。

   17.将新图片保存到指定的输出文件夹中,使用new_image.save()函数。

   18.使用messagebox.showinfo()函数显示一个信息消息对话框,提示图片处理完成。

总结:

       目的是将输入文件夹中的图片处理成四宫格的形式,并保存到指定的输出文件夹中。

7.音乐部分 :

image.gif

解读:

  1. 创建一个名为 music_list 的变量,并用一个包含音乐文件路径的列表进行初始化。这些路径表示存储在计算机上的音乐文件的位置。
  2. 创建一个名为 current_index 的变量,并将其初始化为 0。这个变量表示当前播放的音乐在列表中的索引。
  3. 定义一个名为 play_music() 的函数。
  4. play_music() 函数内部,使用 pygame.mixer.init() 初始化音乐模块。这将准备音乐播放所需的资源。
  5. 使用 pygame.mixer.music.load() 函数加载 music_list 中当前索引位置对应的音乐文件。
  6. 使用 pygame.mixer.music.play() 函数循环播放音乐。
  7. 定义一个名为 change_music() 的函数。
  8. change_music() 函数内部,使用 pygame.mixer.music.stop() 函数停止当前正在播放的音乐。
  9. 根据当前索引计算下一个要播放的音乐文件的索引,并将结果保存在 current_index 变量中。使用取模操作符 % 来实现循环切换。
  10. 使用 pygame.mixer.music.load() 函数加载 music_list 中新的索引位置对应的音乐文件。
  11. 使用 pygame.mixer.music.play() 函数循环播放新的音乐。
  12. 定义一个名为 stop_music() 的函数。
  13. stop_music() 函数内部,使用 pygame.mixer.music.stop() 函数停止音乐播放。

总结:

       (1)展示了一个简单的音乐播放器的实现。music_list 列表存储了要播放的音乐文件的路径,current_index 变量跟踪当前播放的音乐文件的位置。

  (2)play_music() 函数用于播放音乐,change_music() 函数用于切换音乐,stop_music() 函数用于停止音乐播放。使用 Pygame 库,可以加载和播放音乐文件,实现基本的音乐播放功能。

8.创建ui部分:

(1)主窗口ui部分:

image.gif

解读:

  1. 定义一个名为 create_gui() 的函数,用于创建用户界面 (UI)
  2. 创建一个 Tkinter 窗口,使用 tk.Tk() 创建并赋值给 root 变量
  3. 定义窗口的宽度和高度,并将其赋值给 window_widthwindow_height 变量
  4. 使用 root.geometry() 方法设置窗口的宽度和高度。将窗口宽度和高度作为参数传递给该方法
  5. 使用 root.title() 方法设置窗口的标题,其中标题作为参数传递给该方法
  6. 加载背景图片,使用 Image.open() 打开背景图片文件,并将其赋值给 bg_image 变量
  7. 使用 bg_image.resize() 方法调整背景图片的大小,将宽度和高度调整为窗口的宽度和高度,并重新赋值给 bg_image 变量
  8. 使用 ImageTk.PhotoImage() 方法将背景图片转换为可用于 Tkinter 的格式,并将其赋值给 bg_image 变量
  9. 创建一个标签对象,使用 tk.Label() 创建并赋值给 background_label 变量。此标签将用于显示背景图片
  10. 使用 background_label.place() 方法将标签放置在窗口上,覆盖整个窗口。xy 参数设置标签的位置,relwidthrelheight 参数设置标签的大小,相对于窗口的宽度和高度的比例

总结:

       (1)展示了一个创建用户界面的函数。使用 Tkinter 库,创建了一个窗口,并设置了窗口的标题、大小。

       (2)通过加载背景图片并将其转换为可用于 Tkinter 的格式,创建了一个用于显示背景图片的标签,并将其放置在窗口上。这样就创建了一个具有背景图片的界面。

(2)文件夹ui部分:

image.gif

解读:

  1. 创建一个文本标签(input_folder_label),用于显示文本内容"单图片文件夹路径:"。
  2. 将文本标签(input_folder_label)添加到窗口(root)上,并自动调整位置。
  3. 创建一个文本输入框(input_folder_entry),用于输入单图片文件夹路径。
  4. 将文本输入框(input_folder_entry)添加到窗口(root)上,并自动调整位置。
  5. 创建一个按钮(input_folder_button),显示文本内容"选择文件夹",并在点击后调用select_folder函数,将input_folder_entry作为参数传递。
  6. 将按钮(input_folder_button)添加到窗口(root)上,并自动调整位置。
  7. 创建一个文本标签(output_folder_label),用于显示文本内容"保存九宫格文件夹路径:"。
  8. 将文本标签(output_folder_label)添加到窗口(root)上,并自动调整位置。
  9. 创建一个文本输入框(output_folder_entry1),用于输入保存九宫格文件夹路径。
  10. 将文本输入框(output_folder_entry1)添加到窗口(root)上,并自动调整位置。
  11. 创建一个按钮(output_folder_button),显示文本内容"选择文件夹",并在点击后调用select_folder函数,将output_folder_entry1作为参数传递。
  12. 将按钮(output_folder_button)添加到窗口(root)上,并自动调整位置。
  13. 创建一个按钮(process_button),显示文本内容"九宫格图片处理",并在点击后调用process_images函数,将input_folder_entry和output_folder_entry1作为参数传递。
  14. 将按钮(process_button)添加到窗口(root)上,并自动调整位置。
  15. 创建一个文本标签(output_folder_label),用于显示文本内容"保存四宫格文件夹路径:"。
  16. 将文本标签(output_folder_label)添加到窗口(root)上,并自动调整位置。
  17. 创建一个文本输入框(output_folder_entry2),用于输入保存四宫格文件夹路径。
  18. 将文本输入框(output_folder_entry2)添加到窗口(root)上,并自动调整位置。
  19. 创建一个按钮(output_folder_button),显示文本内容"选择文件夹",并在点击后调用select_folder函数,将output_folder_entry2作为参数传递。
  20. 将按钮(output_folder_button)添加到窗口(root)上,并自动调整位置。
  21. 创建一个按钮(process_button),显示文本内容"四宫格图片处理",并在点击后调用process_images2函数,将input_folder_entry和output_folder_entry2作为参数传递。
  22. 将按钮(process_button)添加到窗口(root)上,并自动调整位置。

总结:

       (1)实现了一个简单的UI界面,用于选择文件夹并进行九宫格图片处理和四宫格图片处理。

       (2)第一段代码创建了用于输入单图片文件夹路径和保存九宫格文件夹路径的文本框和按钮,并定义了处理函数process_images。

       (3)添加了用于保存四宫格文件夹路径的文本框和对应的处理函数process_images2。

       (4)可以选择不同的文件夹路径,并通过点击按钮进行不同类型的图片处理操作。

(3) 音乐ui部分:

image.gif

解读:

  1. 创建一个按钮(play_button),显示文本内容"播放音乐",并在点击后调用play_music函数。
  2. 将按钮(play_button)添加到窗口(root)上,并自动调整位置。
  3. 创建一个按钮(change_button),显示文本内容"切换音乐",并在点击后调用change_music函数。
  4. 将按钮(change_button)添加到窗口(root)上,并自动调整位置。
  5. 创建一个按钮(stop_button),显示文本内容"停止音乐",并在点击后调用stop_music函数。
  6. 将按钮(stop_button)添加到窗口(root)上,并自动调整位置。
  7. 进入主循环,等待用户操作。
  8. 如果该脚本作为主程序运行,调用create_gui函数创建UI界面。

总结:

       (1)实现了一个简单的音乐播放的UI界面。通过创建播放音乐、切换音乐和停止音乐的按钮,并分别绑定相应的函数来实现对音乐播放的操作。

       (2)可以点击按钮来控制音乐的播放、切换和停止。

9. 项目打包为exe文件:

一般打包流程(出现打包后运行缺少模块请移步特殊打包):

  1. 确保安装了pyinstaller模块:
  • 在命令行中执行以下命令来安装pyinstaller:pip install pyinstaller
  1. 进入项目所在的目录:
  • 在命令行中使用cd命令进入您的项目根目录。
  1. 执行打包命令:
  • 在命令行中执行以下命令来打包您的Python脚本为可执行文件:
pyinstaller --onefile your_script_name.py

image.gif

  • 替换your_script_name.py为您的Python脚本的文件名。
  1. 等待打包完成:
  • 打包过程可能会花费一些时间,具体时间取决于您的项目规模和所使用的模块数量。
  1. 查找生成的可执行文件:
  • 打包完成后,在同一目录中会生成一个名为dist的文件夹。
  • dist文件夹中,会有一个与您的Python脚本同名的可执行文件,带有.exe的扩展名。

特殊打包流程:

  1. 指定输出目录:
pyinstaller --onefile --distpath=output your_script_name.py
  1. 这将会将打包生成的可执行文件放置在指定的output目录中。
  2. 包含其他文件或目录(出现运行后缺少某个模块,需要找到缺少包的路径,注意路径后面要有分号包名 )(具体按照示例模仿进行):
pyinstaller -F -w -i 1.ico --add-data "D:\\python库学习\\Lib\\site-packages\\pygame;pygame" picture.py

image.gif

  1. -F:指定打包方式为单个可执行文件(Frozen)。
  2. -w:指定以窗口模式运行,即无终端命令窗口,直接运行图形界面应用程序。
  3. -i 1.ico:指定应用程序图标,将1.ico替换为您自己的图标文件路径。
  4. --add-data "D:\\python库学习\\Lib\\site-packages\\pygame;pygame":指定要包含的额外文件或目录。这里将Pygame库的路径与别名pygame一起添加到打包文件中。
  5. 如果需要额外加入多个内容比如将音乐一起打包可以使用
  6. pyinstaller -F -w -i 1.ico --add-data "D:\\python库学习\\Lib\\site-packages\\pygame;pygame" --add-data "C:\\Users\\86199\\Desktop\\图片处理工具\\music/*.mp3;music" 图片工具.py  
  7. 多个--add-data 加路径和包名模仿上面一个代码进行。
  8. picture.py:指定要打包的Python脚本文件。
  9. 引入额外的模块:
pyinstaller --onefile --hidden-import your_module your_script_name.py
  1. image.gif 使用--hidden-import参数来明确指定需要引入的额外模块。
  2. 设置可执行文件的图标:
pyinstaller --onefile --icon=your_icon.ico your_script_name.py
  1. image.gif your_icon.ico替换为自定义的图标文件路径,以使生成的可执行文件具有指定的图标。

10.具体实行内容:

运行界面:

image.gif

运行前单图片:

image.gif

四宫格处理:

image.gif

九宫格处理:

image.gif

三,总结:

通过九个不同的模块共同构成了这个项目:

1.导入库

2.对图片进行九宫格图片分组处理

3.文件选择

4.对图片进行组成九宫格图片处理

5.对图片进行四宫格图片分组处理

6.对图片进行组成四宫格图片处理

7.音乐部分

8.创建ui部分

9. 项目打包为exe文件

       以上就是项目的所有内容,介绍了项目代码学习的每一个模块,python库是我们学习和使用的一种便利工具需要多加学习。

相关文章
|
16小时前
|
数据安全/隐私保护 Python
python 图片打水印 透明图片合并
python 图片打水印 透明图片合并
6 1
|
15小时前
|
存储 计算机视觉 Python
python实现Gif图片的字符画
这是一个Python实战项目,旨在将GIF动态图转化为ASCII字符动画。项目适合有一定Python基础的学习者,主要使用os、imageio、PIL库。首先,代码导入所需库,然后通过PIL创建空白图片并添加文本。接着,程序读取GIF,拆分帧并转为字符画,存入“tmp”目录。同时,代码提供了清空“tmp”目录、将灰度值映射为ASCII字符、将图片处理成字符画的函数。此外,还有创建新画布和合成GIF的步骤。主函数调用这些模块,最终将ASCII字符画合并成GIF。项目展示了将动态图像转换为ASCII艺术的过程。
|
15小时前
|
Python
python代码根据点坐标裁切图片
【4月更文挑战第19天】python代码根据点坐标裁切图片
27 2
|
15小时前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取
|
15小时前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
16小时前
|
计算机视觉 Python
|
16小时前
|
存储 前端开发 安全
python窗口刷新图片
【4月更文挑战第11天】
|
16小时前
|
文字识别 数据挖掘 网络安全
Python实现avif图片转jpg格式并识别图片中的文字
在做数据分析的时候有些数据是从图片上去获取的,这就需要去识别图片上的文字。Python有很多库可以很方便的实现OCR识别图片中的文字。这里介绍用EasyOCR库进行图片文字识别。easyocr是一个比较流行的库,支持超过80种语言,识别率高,速度也比较快。
38 2
|
16小时前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
【5月更文挑战第9天】`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
27 5
|
15小时前
|
存储 Python 容器
Python高级编程
Python集合包括可变的set和不可变的frozenset,用于存储无序、不重复的哈希元素。创建集合可使用{}或set(),如`my_set = {1, 2, 3, 4, 5}`。通过add()添加元素,remove()或discard()删除元素,如`my_set.remove(3)`。
11 0