图片隐写其实就是将图片和文件和并在一张图片里面。
在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. 其他隐写方法

  • 还包括但不限于利用图像的纹理、边缘、亮度等特性来隐藏信息的方法。这些方法通常需要根据图像的具体内容和特点来设计相应的算法。

总之,图片隐写技术多种多样,每种技术都有其独特的优势和局限性。在实际应用中,需要根据具体需求和场景选择合适的隐写方法,并权衡隐蔽性、鲁棒性和嵌入容量等因素。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部