今天,我们将深入研究一个令人兴奋的项目,该项目将图像处理与基本加密技术相结合。我们将探索一个可以使用简单而有效的方法加密和解密图像的 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
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!")
加密和解密函数:
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中文网其他相关文章!