揭秘数字水印技术:使用PyQt5实现图像中的LSB隐写术

news2024/11/15 23:27:59

在当今的数字化世界中,保护信息的安全性和隐秘性变得尤为重要。无论是在保护版权的数字水印,还是在隐秘传输信息的过程中,数字隐写术(Steganography)都是一种不可或缺的技术。今天,我们将带领大家探索一种简单而有效的隐写技术——LSB(最低有效位)隐写术,并通过Python的PyQt5库实现一个简单的图像水印应用。

前言

数字隐写术是一门通过在数字媒体(如图像、音频、视频等)中隐藏信息的技术。在图像隐写中,最常见的一种方法就是修改图像像素的最低有效位(Least Significant Bit, LSB),以在不显著改变图像外观的前提下嵌入信息。本文将展示如何利用PyQt5构建一个图形用户界面(GUI),通过LSB技术实现数据的嵌入与提取。

项目概述

本项目的主要目标是实现一个用户友好的GUI应用,允许用户将文本数据嵌入到图像中,或者从图像中提取隐藏的数据。整个项目由三个主要部分组成:

  1. 核心功能实现:使用PIL(Python Imaging Library)处理图像,通过LSB技术嵌入和提取数据。
  2. 用户界面设计:基于PyQt5构建的图形用户界面,简化用户操作。
  3. 文件选择与存储:通过PyQt5的文件对话框,方便用户选择文件和保存结果。
一、LSB隐写技术的实现

LSB隐写技术的核心在于将信息嵌入到图像的像素数据中。每个像素由多个颜色通道(如RGB)组成,每个通道的值通常为8位二进制数。通过修改这些二进制数的最低有效位,我们可以将数据嵌入其中,而不明显影响图像的视觉效果。

1. 数据嵌入

LSB_embed函数通过打开图像文件和文本文件,将文本数据转换为二进制字符串,并将这些二进制数据逐位嵌入图像的像素中。

def LSB_embed(image_path, text_path, output_path):
    im = Image.open(image_path)
    width, height = im.size
    key = get_key(text_path)
    keylen = len(key)
    count = 0

    for h in range(height):
        for w in range(width):
            if count == keylen:
                break
            pixel = im.getpixel((w, h))
            new_pixel = tuple(
                channel - mod(channel, 2) + int(key[count + i])
                if count + i < keylen else channel
                for i, channel in enumerate(pixel)
            )
            im.putpixel((w, h), new_pixel)
            count += len(pixel)
            if count >= keylen:
                break

    im.save(output_path)
2. 数据提取

LSB_extract函数用于从图像中提取隐藏的数据。通过逐像素读取图像的最低有效位,重构出原始的二进制数据,并将其转换为文本文件。

def LSB_extract(image_path, length, output_path):
    try:
        im = Image.open(image_path)
        width, height = im.size
        bits = ""

        for h in range(height):
            for w in range(width):
                pixel = im.getpixel((w, h))
                bits += ''.join(str(mod(channel, 2)) for channel in pixel)
                if len(bits) >= length * 8:
                    break
            if len(bits) >= length * 8:
                break

        data = bytes(int(bits[i:i+8], 2) for i in range(0, len(bits), 8))
        with open(output_path, "wb") as f:
            f.write(data)
        return True
    except Exception as e:
        QMessageBox.critical(None, "Error", f"An error occurred: {e}")
        return False
二、用户界面的设计

我们使用PyQt5设计了一个简单易用的GUI。该界面允许用户选择图像文件、文本文件,并选择保存嵌入了数据的图像。用户还可以选择提取图像中的隐藏文本,并将其保存到文本文件中。

主要组件
  • 图像显示标签 (QLabel): 用于显示用户选择的图像。
  • 按钮 (QPushButton): 用于选择图像文件、文本文件以及执行嵌入和提取操作。
  • 消息框 (QMessageBox): 用于显示操作结果和错误信息。
代码示例

下面是实现上述功能的代码片段:

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog, QMessageBox, QInputDialog
from PyQt5.QtGui import QPixmap
from PIL import Image
import sys
import qdarkstyle
import re

class MainApp(QMainWindow):
    def __init__(self, parent=None):
        super(MainApp, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setWindowTitle("LSB隐写工具")
        self.setGeometry(100, 100, 800, 600)

        layout = QVBoxLayout()
        
        self.show_img_label = QLabel(self)
        layout.addWidget(self.show_img_label)

        self.select_img_pushButton = QPushButton("选择图片", self)
        self.select_img_pushButton.clicked.connect(self.open_image_file)
        layout.addWidget(self.select_img_pushButton)

        self.embed_data_pushButton = QPushButton("嵌入数据", self)
        self.embed_data_pushButton.clicked.connect(self.embed_data)
        layout.addWidget(self.embed_data_pushButton)

        self.extract_data_pushButton = QPushButton("提取数据", self)
        self.extract_data_pushButton.clicked.connect(self.extract_data)
        layout.addWidget(self.extract_data_pushButton)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def open_image_file(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图像文件 (*.png *.jpg *.jpeg *.bmp)")
        if file_name:
            pixmap = QPixmap(file_name)
            self.show_img_label.setPixmap(pixmap)
            self.current_image_path = file_name

    def embed_data(self):
        # ...(嵌入数据代码略)

    def extract_data(self):
        # ...(提取数据代码略)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    window = MainApp()
    window.show()
    sys.exit(app.exec_())

总结

通过本文的示例代码,我们可以了解到如何使用PyQt5和PIL实现一个基于LSB隐写术的图像数据隐藏与提取工具。该工具不仅具有简单的GUI界面,而且能够有效地隐藏和提取文本数据。这种技术可以应用于数据保护、信息隐藏等领域,为用户提供了一个简单且功能强大的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于LLC知识14

1、LLC必须工作在感性区 2、为了降低LLC进入容性区后MOS管的电流应力&#xff0c;必须要选择快管&#xff0c;对体二极管的反向恢复参数有要求&#xff1a;trr<200ns 3、对于上下管的死区时间不能太短&#xff0c;否则电容无法充放电完成&#xff0c;就无法实现ZVS导通 如…

DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3)

DNN学习平台&#xff08;GoogleNet、SSD、FastRCNN、Yolov3&#xff09; 前言相关介绍1&#xff0c;登录界面&#xff1a;2&#xff0c;主界面&#xff1a;3&#xff0c;部分功能演示如下&#xff08;1&#xff09;识别网络图片&#xff08;2&#xff09;GoogleNet分类&#xf…

短视频去哪里找素材?16个有短视频素材APP网站分享给你

短视频创作爱好者们&#xff0c;你们好&#xff01;在这个充斥视觉内容的年代&#xff0c;制作一部引人注目的短视频无疑是一项挑战&#xff0c;但也是一种艺术。要想打造出色的视频内容&#xff0c;首先需要的是高质量的素材。今天&#xff0c;我将向大家推荐几个非常棒的短视…

windows安装macos虚拟机

我用的是macOS Ventura 13.5(22G74) MH.iso 下载链接 https://macoshome.com/macos/20492.html#Down 一、下载unlocker 用于给VMware提供macos选项 下载链接 https://github.com/DrDonk/unlocker/releases/tag/v4.2.7下载好后解压&#xff0c;进入windows目录&#xff0c;双…

鸿蒙(API 12 Beta3版)【通过字节数组生成码图】

基本概念 码图生成能力支持将字节数组转换为自定义格式的码图。 场景介绍 码图生成能力支持将字节数组转换为自定义格式的码图。 例如&#xff1a;调用码图生成能力, 将字节数组转换成交通一卡通二维码使用。 约束与限制 只支持QR Code生成&#xff0c;根据纠错水平不同对…

mysql中的mysql 库不存在,进行恢复

mysql中的mysql 库不存在&#xff0c;进行恢复 解决方法&#xff1a; 关闭数据库 service mysqld stop 以跳过权限认证方式启动mysql mysqld_safe --defaults-file/etc/my.cnf --skip-grant-tables & 在输入&#xff1a;mysql -u root 在输入&#xff1a;use mysql 在输…

【PyQt5 应用程序】一个数据可视化案例

为了提供一个数据可视化应用的示例将创建一个简单的应用程序,该程序展示了如何使用PyQt和Qt Charts模块来绘制一个柱状图和一个曲线图。 这个示例将展示销售数据的趋势。 请确保已经安装了PyQt5和PyQtChart。如果没有安装可以通过pip安装它们: pip install PyQt5 PyQtChart…

Linux Debian12使用flameshot或gnome-screenshot和ImageMagick垂直合并多张图片后组成一张滚动长图

在发布博客&#xff0c;有时需要滚动截长图&#xff0c;虽然在windows系统有滚动截长图的工具&#xff0c;例如&#xff1a;FastStone Capture等&#xff0c;但是Linux Debian系统&#xff0c;这种滚动截长图的工具没有找到合适的。经过自己筛选验证&#xff0c;发现Linux Debi…

四、生成房间之间的连线

一、连线 使用LineRenderer组件&#xff0c;调整坐标轴&#xff0c;更改线的粗细 需要给这个组件创建一个材质&#xff0c;最后制作成预制体进行实例化&#xff1b; 二、声明线组件 创建哈希列表 哈希列表中没有重复的数值&#xff0c;而list中有重复的 在此项目中&#xff…

【香橙派系列教程】(二十一) 基于OrangePi Zero2的系统移植— 交叉编译工具链配置

【二十一】基于OrangePi Zero2的系统移植— 交叉编译工具链配置 文章目录 【二十一】基于OrangePi Zero2的系统移植— 交叉编译工具链配置1.关于编译2.本地编译3.交叉编译 1.关于编译 编译是指将源代码文件&#xff08;如C/C文件&#xff09;经过预处理、编译、汇编和链接等步…

P1509 找啊找啊找GF

人才出题人&#xff0c;挺会整活的。。。 一眼二维费用背包。 题目要求不单单是求最小时间&#xff0c;还要保证MM数量最多。 需要开两个数组f,dp,分别代表给定人品&#xff0c;钱能get到的最多MM数量&#xff0c;确保最多数量下的最少时间花费。 将人品&#xff0c;钱作为…

开关电源测试设备的自动化测试与测试项目

在军工、工业自动化控制、医疗设备等关键领域&#xff0c;开关电源扮演着至关重要的角色。而如何确保这些电源的质量与性能&#xff0c;开关电源自动测试设备为我们提供了答案。 开关电源测试 开关电源测试是为了检测电源的性能和质量&#xff0c;从而全面测试开关电源的各项参…

【Blender】快捷键_ 学习日志_01

【Blender】快捷键_ 学习日志_01 学习了blender的快捷键的使用。 2024年8月30日 视角操控 围绕中心旋转&#xff1a;按住鼠标中建 平移视角&#xff1a;Shift鼠标中键 视角前进后退&#xff1a;滚动滚轮 视图切换 0 切换到摄像机视图 1 切换正试图 2&#xff0c;4&…

【赵渝强老师】Redis的管道Pipeline

Redis使用的是客户端-服务器&#xff08;C-S&#xff09;模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤&#xff1a; 第一步&#xff1a;客户端向服务端发送一个查询请求&#xff0c;并监听Socket返回&#xff0c;通常是以阻塞模式&#xff0c;等…

★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--盛水最多的容器~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法1&#xff1a;暴力枚举 …

react项目登录使用验证码

react项目登录使用验证码 imgSrc 的格式是base64 <Row style{{ width: 350 }}><Col><Form.Itemname"verifyCode"rules{[{required: false,message: "请输入验证码!",},]}><Inputstyle{{ width: 213, height: 50 }}placeholder"…

精准操控,稳如磐石:飞控+综控系统仿真揭秘

1.背景 现代飞行器系统中&#xff0c;飞行控制系统和综合控制系统的协同工作是实现精准打击和高度可靠性的关键。 飞行控制系统简称飞控系统&#xff0c;负责飞行器的飞行控制和姿态调整&#xff0c;确保飞行器在飞行过程中维持稳定和精确的轨迹。其主要进行姿态控制、轨迹调…

Redis缓存穿透、缓存击穿与缓存雪崩的详细讲解和案例示范

在高并发的电商交易系统中&#xff0c;Redis缓存的使用可以极大地提高系统的性能。然而&#xff0c;缓存机制也面临着一些挑战&#xff0c;尤其是缓存穿透、缓存击穿和缓存雪崩问题。这些问题如果处理不当&#xff0c;可能导致系统的性能大幅下降&#xff0c;甚至出现系统崩溃的…

【Qt】Spacer

Spacer 在使用布局管理的时候&#xff0c;如果需要在控件之间添加一段空白&#xff0c;就可以使用QSpacerItem来表示。 核心属性 属性说明 width 宽度 height ⾼度 hData ⽔平⽅向的 sizePolicy QSizePolicy::Ignored : 忽略控件的尺⼨&#xff0c;不对布局产⽣影响。 QS…

找搭子神器有哪些?盘点找搭子软件排行榜前十名

现在找搭子文化越来越流行&#xff0c;主打一个“恰到好处的陪伴”&#xff0c;深受年轻人喜爱。以下是一些值得推荐的找搭子软件&#xff1a; 1. 咕哇小程序&#xff1a;特点&#xff1a;这是一个实名制的找搭子交友平台&#xff0c;因此相对较为纯粹&#xff0c;骗子较少。用…