图片隐写术QT
图片隐写其实就是将图片和文件和并在一张图片里面。
在window操作系统中我们可以使用以下命令生成图片二。
将2.jpg已图片打开可以打开看到图片,将2.jpg修改后缀2.zip。又能以压缩包的方式打开压缩包。
copy /b 1.jpg+1.zip D:\\2.jpg
我们使用QT制作以下这个小功能。简单说来就是合并两个二进制文件,将两个文件分别合并成一个文件就可以了。这个东西可以做啥呢?大概就是想传一个压缩包,但是不想让别人知道,然后穿了一个图片。别人以为是图片其实这个图片内涵很多东西。
实现代码如下:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void initUI();
void initConnect();
QPushButton *btnSelectPic;
QPushButton *btnSelectArchive;
QLabel *labSelectPic;
QLabel *labSelectArchive;
QLineEdit *edtSelectPic;
QLineEdit *edtSelectArchive;
QPushButton *btnDoWork;
public slots:
void slotSelectPic();
void slotSelectArchive();
void slotDoWork();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, btnSelectPic(new QPushButton(QStringLiteral("选择图片")))
, btnSelectArchive(new QPushButton(QStringLiteral("选择图片")))
, labSelectPic(new QLabel(QStringLiteral("图片:")))
, labSelectArchive(new QLabel(QStringLiteral("压缩包:")))
, edtSelectPic(new QLineEdit())
, edtSelectArchive(new QLineEdit())
, btnDoWork(new QPushButton(QStringLiteral("生成")))
{
initUI();
initConnect();
}
MainWindow::~MainWindow() {
}
void MainWindow::initUI()
{
QWidget *wdgMain = new QWidget();
QHBoxLayout *layoutPic = new QHBoxLayout();
QHBoxLayout *layoutArchive = new QHBoxLayout();
QVBoxLayout * layoutMain = new QVBoxLayout();
edtSelectPic->setDisabled(true);
edtSelectArchive->setDisabled(true);
layoutPic->addWidget(labSelectPic);
layoutPic->addWidget(edtSelectPic);
layoutPic->addWidget(btnSelectPic);
layoutArchive->addWidget(labSelectArchive);
layoutArchive->addWidget(edtSelectArchive);
layoutArchive->addWidget(btnSelectArchive);
layoutMain->addLayout(layoutPic);
layoutMain->addLayout(layoutArchive);
layoutMain->addWidget(btnDoWork);
wdgMain->setLayout(layoutMain);
setCentralWidget(wdgMain);
}
void MainWindow::initConnect()
{
connect(btnSelectPic,&QPushButton::clicked,this,&MainWindow::slotSelectPic);
connect(btnSelectArchive,&QPushButton::clicked,this,&MainWindow::slotSelectArchive);
connect(btnDoWork,&QPushButton::clicked,this,&MainWindow::slotDoWork);
}
void MainWindow::slotSelectPic()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("JPG Files (*.jpg);;All Files (*)"));
edtSelectPic->setText(fileName);
}
void MainWindow::slotSelectArchive()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("zip Files (*.zip);;All Files (*)"));
edtSelectArchive->setText(fileName);
}
void MainWindow::slotDoWork()
{
QString picNamePath = edtSelectPic->text();
QString ArchiveNamePath = edtSelectArchive->text();
QFile outFile("out");
QFile ArchiveFile(ArchiveNamePath);
QFile picFile(picNamePath);
if (picFile.open(QIODevice::ReadOnly ) && outFile.open(QIODevice::WriteOnly | QIODevice::Unbuffered) && ArchiveFile.open(QIODevice::ReadOnly)) {
QByteArray picData = picFile.readAll();
QByteArray archiveData = ArchiveFile.readAll();
outFile.write(picData) ;
outFile.write(archiveData);
}
outFile.close();
ArchiveFile.close();
picFile.close();
}
源码地址
https://gitcode.net/arv002/qt/-/tree/master/ImageSteganography
三、图片隐写术种类
1. 最低有效位(LSB, Least Significant Bit)隐写法
- 原理:通过修改图像像素的最低有效位来嵌入数据。由于人类视觉系统对细微的颜色差异不敏感,因此这种方法能够隐蔽地嵌入少量的数据而不易察觉。
- 特点:简单且计算开销低,但隐蔽性较差,容易被检测到。
2. 频域隐写法
- 原理:将图像从空间域转换到频域,通过改变图像的频率成分来隐藏数据。常用的技术有离散傅里叶变换(DFT)、离散余弦变换(DCT)和离散小波变换(DWT)。
- 特点:隐蔽性较高,但实现较为复杂。信息不是直接以像素强度隐藏在图像中,而是隐藏在像素系数中,通常用于JPEG等格式的图像。
3. 颜色模型隐写法
- 原理:利用图像的颜色模型(如RGB、HSV等)的特性来隐藏信息。例如,在RGB颜色模型中,可以通过调整颜色分量的值来嵌入数据。
- 特点:具体实现方式多样,隐蔽性和鲁棒性取决于具体的算法设计。
4. 基于深度学习的隐写方法
- 原理:利用深度学习模型(如生成对抗网络GAN)来生成含密图像。这些模型能够学习如何将秘密信息嵌入到图像中,同时保持图像的视觉质量。
- 特点:隐写内容丰富,隐写容量大,且能够抵抗一些传统的隐写分析方法。然而,深度学习模型的复杂性和训练成本也较高。
5. 拼合隐写法
- 原理:通过将多个图像或图像的一部分拼接在一起来隐藏信息。这种方法可以通过调整拼接区域的像素值来嵌入秘密信息。
- 特点:隐蔽性较高,但需要确保拼接后的图像在视觉上保持连贯性。
6. 扭曲隐写法
- 原理:通过轻微地扭曲图像的某些部分来隐藏信息。这种扭曲可以是几何变换(如旋转、缩放)或像素值的变化。
- 特点:能够在不影响图像整体视觉效果的情况下隐藏信息,但需要对扭曲参数进行精细控制。
7. 其他隐写方法
- 还包括但不限于利用图像的纹理、边缘、亮度等特性来隐藏信息的方法。这些方法通常需要根据图像的具体内容和特点来设计相应的算法。
总之,图片隐写技术多种多样,每种技术都有其独特的优势和局限性。在实际应用中,需要根据具体需求和场景选择合适的隐写方法,并权衡隐蔽性、鲁棒性和嵌入容量等因素。