今天,我们将深入研究一个令人兴奋的项目,该项目将图像处理与基本加密技术相结合。我们将探索一个可以使用简单而有效的方法加密和解密图像的 Python 程序。让我们一步步分解吧!
先决条件
要跟随,您应该:
- Python 编程基础知识。
- Python 安装在您的计算机上。
Pillow 库,这是一个用于处理图像的 Python 成像库。使用 pip installpillow 来安装。
Tkinter 这是一个用于构建图形用户界面 (GUI) 的 Python 库。使用 pip install tk 进行安装。
这个程序有什么作用?
该程序创建了一个图形用户界面 (GUI),允许用户:
- 选择图像文件
- 选择输出位置
- 输入种子密钥
- 加密或解密图像
加密过程根据种子密钥对图像的像素进行混洗,从而使图像无法识别。解密过程逆转了这一过程,恢复了原始图像。
代码说明
导入所需的库
import os from tkinter import Tk, Button, Label, Entry, filedialog, messagebox from PIL import Image import random
- os 提供与操作系统交互的函数。
- tkinter 提供 GUI 元素,如按钮、标签和输入字段。
- PIL(Pillow)允许我们打开、操作和保存图像。
- random 帮助我们使用 种子. 以确定的方式对像素进行洗牌
种子随机生成器函数
def get_seeded_random(seed): """Returns a seeded random generator.""" return random.Random(seed)
get_seed_random 函数返回一个随机对象,如果给定相同的种子值,该对象每次都可以以相同的方式对项目进行洗牌。
这是一致加密和解密图像的关键。
图像加密
def encrypt_image(input_image_path, output_image_path, seed): """Encrypts the image by manipulating pixel values.""" image = Image.open(input_image_path) width, height = image.size # Get pixel data as a list pixels = list(image.getdata()) random_gen = get_seeded_random(seed) # Create a list of pixel indices indices = list(range(len(pixels))) # Shuffle the indices using the seeded random generator random_gen.shuffle(indices) # Reorder pixels based on shuffled indices encrypted_pixels = [pixels[i] for i in indices] # Create new image encrypted_image = Image.new(image.mode, (width, height)) # Apply encrypted pixels to the new image encrypted_image.putdata(encrypted_pixels) # Save the encrypted image encrypted_image.save(output_image_path) return True
在此 encrypt_image 函数中:
- 我们加载图像并提取其像素数据。
- 使用种子随机生成器对像素顺序进行打乱,以确保解密时保持相同的打乱顺序。
- 我们使用打乱后的像素值创建一个新图像,并将其保存为加密图像。
图像解密
def decrypt_image(input_image_path, output_image_path, seed): """Decrypts the image by reversing the encryption process.""" image = Image.open(input_image_path) width, height = image.size # Get encrypted pixel data as a list encrypted_pixels = list(image.getdata()) random_gen = get_seeded_random(seed) # Create a new list to hold pixel indices in their original order indices = list(range(len(encrypted_pixels))) # Shuffle the indices again to get the original order random_gen.shuffle(indices) # Create a new image to hold the decrypted data decrypted_pixels = [None] * len(encrypted_pixels) # Restore original pixels using the shuffled indices for original_index, shuffled_index in enumerate(indices): decrypted_pixels[shuffled_index] = encrypted_pixels[original_index] # Save the decrypted image decrypted_image = Image.new(image.mode, (width, height)) decrypted_image.putdata(decrypted_pixels) decrypted_image.save(output_image_path) return True
decrypt_image 函数通过反转加密过程来工作。它:
- 加载加密图像。
- 使用相同的随机种子将像素重新调整回原来的顺序。
- 使用解密的像素创建并保存新图像。
文件选择功能
def select_input_image(): """Opens a file dialog to select an input image.""" input_image_path = filedialog.askopenfilename(title="Select Image") input_image_label.config(text=input_image_path) def select_output_image(): """Opens a file dialog to select an output image path.""" output_image_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png"),("JPEG files", "*.jpg;*.jpeg"),("All files", "*.*")], title="Save Encrypted/Decrypted Image") output_image_label.config(text=output_image_path)
select_input_image 函数允许用户使用文件对话框选择他们想要加密或解密的图像。
选定的图像路径将显示在 GUI 上。
同样,select_output_image函数允许用户选择保存输出图像的位置。
加密和解密按钮功能
def encrypt(): input_image_path = input_image_label.cget("text") output_image_path = output_image_label.cget("text") seed = seed_entry.get() if not input_image_path or not output_image_path: messagebox.showerror("Error", "Please select input and output images.") return if encrypt_image(input_image_path, output_image_path, seed): messagebox.showinfo("Success", "Image encrypted successfully!") def decrypt(): input_image_path = input_image_label.cget("text") output_image_path = output_image_label.cget("text") seed = seed_entry.get() if not input_image_path or not output_image_path: messagebox.showerror("Error", "Please select input and output images.") return if decrypt_image(input_image_path, output_image_path, seed): messagebox.showinfo("Success", "Image decrypted successfully!")
加密和解密函数:
- 获取选定的文件路径和用户输入的种子值。
- 确保用户在继续之前已选择输入和输出图像路径。
- 调用相应的 encrypt_image() 或 decrypt_image() 函数并在完成后显示成功消息。
创建图形用户界面
root = Tk() root.title("Image Encryption Tool") # Create and place widgets Label(root, text="Select Image to Encrypt/Decrypt:").pack(pady=5) input_image_label = Label(root, text="No image selected") input_image_label.pack(pady=5) Button(root, text="Browse", command=select_input_image).pack(pady=5) Label(root, text="Output Image Path:").pack(pady=5) output_image_label = Label(root, text="No output path selected") output_image_label.pack(pady=5) Button(root, text="Save As", command=select_output_image).pack(pady=5) Label(root, text="Enter Seed Key:").pack(pady=5) seed_entry = Entry(root) seed_entry.pack(pady=5) Button(root, text="Encrypt Image", command=encrypt).pack(pady=5) Button(root, text="Decrypt Image", command=decrypt).pack(pady=5) root.mainloop()
标签、按钮和文本输入字段使用 pack() 放置。
root.mainloop 函数使窗口保持打开状态并响应用户输入。
行动计划
结论
该程序演示了如何在像素级别操作数字图像以及如何使用伪随机数生成器来执行基本加密任务。
祝您编码愉快,并保持安全!
以上是使用 Python 构建简单的图像加密工具的详细内容。更多信息请关注PHP中文网其他相关文章!

可以使用多种方法在Python中连接两个列表:1.使用 操作符,简单但在大列表中效率低;2.使用extend方法,效率高但会修改原列表;3.使用 =操作符,兼具效率和可读性;4.使用itertools.chain函数,内存效率高但需额外导入;5.使用列表解析,优雅但可能过于复杂。选择方法应根据代码上下文和需求。

有多种方法可以合并Python列表:1.使用 操作符,简单但对大列表不内存高效;2.使用extend方法,内存高效但会修改原列表;3.使用itertools.chain,适用于大数据集;4.使用*操作符,一行代码合并小到中型列表;5.使用numpy.concatenate,适用于大数据集和性能要求高的场景;6.使用append方法,适用于小列表但效率低。选择方法时需考虑列表大小和应用场景。

CompiledLanguagesOffersPeedAndSecurity,而interneterpretledlanguages provideeaseafuseanDoctability.1)commiledlanguageslikec arefasterandSecureButhOnderDevevelmendeclementCyclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesandentency.2)cransportedeplatectentysenty

Python中,for循环用于遍历可迭代对象,while循环用于条件满足时重复执行操作。1)for循环示例:遍历列表并打印元素。2)while循环示例:猜数字游戏,直到猜对为止。掌握循环原理和优化技巧可提高代码效率和可靠性。

要将列表连接成字符串,Python中使用join()方法是最佳选择。1)使用join()方法将列表元素连接成字符串,如''.join(my_list)。2)对于包含数字的列表,先用map(str,numbers)转换为字符串再连接。3)可以使用生成器表达式进行复杂格式化,如','.join(f'({fruit})'forfruitinfruits)。4)处理混合数据类型时,使用map(str,mixed_list)确保所有元素可转换为字符串。5)对于大型列表,使用''.join(large_li

pythonuseshybridapprace,ComminingCompilationTobyTecoDeAndInterpretation.1)codeiscompiledtoplatform-Indepententbybytecode.2)bytecodeisisterpretedbybythepbybythepythonvirtualmachine,增强效率和通用性。

theKeyDifferencesBetnewpython's“ for”和“ for”和“ loopsare:1)” for“ loopsareIdealForiteringSequenceSquencesSorkNowniterations,而2)”,而“ loopsareBetterforConterContinuingUntilacTientInditionIntionismetismetistismetistwithOutpredefinedInedIterations.un

在Python中,可以通过多种方法连接列表并管理重复元素:1)使用 运算符或extend()方法可以保留所有重复元素;2)转换为集合再转回列表可以去除所有重复元素,但会丢失原有顺序;3)使用循环或列表推导式结合集合可以去除重复元素并保持原有顺序。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。