我目前正在用Qt编写一个隐写术应用程序.我试图隐藏在像素的蓝色的最低有效位中的消息位.
从调试我可以看出这部分正常工作.然而,在将我的位隐藏在消息中后,我保存图像然后重新打开它.这是问题发展的地方.
当我读入(重新打开)的图像时scanLines,我读到的图像与我之前写的图像不同,我无法弄清楚原因.也许这只是我的愚蠢,或者我可能错过了一些东西.任何帮助将非常感激.
我到目前为止的代码如下
void MainWindow::Encrypt(QImage image, QString message) {
if(image.isNull()) {
qDebug() << "PROBLEM";
}
image = image.convertToFormat(QImage::Format_ARGB32);
QVector<bool> bvec;
QByteArray bytes = message.toAscii();
char mask;
QRgb tempPix;
for(int i = 0; i < bytes.size(); i++) {
for(int j = 0; j < 8; j++) {
mask = (0x01 << j);
bvec.push_back((bytes[i] & mask) == mask);
}
}
if(image.height() < bvec.size()) {
qDebug() << "Not enough space in image";
}
for(int j = 0; j < bvec.size(); …Run Code Online (Sandbox Code Playgroud) 我知道可以在 Batch 中使用带有 '/B' 开关的 'copy' 命令,即:
copy /B imagefile+hiddenfile newfile
Run Code Online (Sandbox Code Playgroud)
我的问题是这样的;是否可以在 Python 中执行此操作,如果可以,如何执行?
这个问题很相似,答案是可以接受的,但我还是很好奇;
有没有办法在没有 stepic 模块的情况下做到这一点?
我在C中用bmp图像编写了一个简单的隐写术工具.
我将图像读取到内存中,并将文本隐藏在char字节[8]中,一次一个字符.
所以,例如.
a=0d97
bytes[0] = 0
bytes[1] = 1
bytes[2] = 1
bytes[3] = 0
bytes[4] = 0
bytes[5] = 0
bytes[6] = 0
bytes[7] = 1
Run Code Online (Sandbox Code Playgroud)
然后我将转到第一个图像字节(char *ptr points它每次)将字节[0]放到LSB,然后是下一个等.
如果*ptr=0xff or 0b11111111我必须将最后的1设置为0.这可以与
*ptr = *ptr ^ 0x01 ;
Run Code Online (Sandbox Code Playgroud)
但如果*ptr = 0x00或者0b00000000xor doesent工作,因为0^1=1
我很困惑如何设置案例.我需要一个运算符在每次0时最后一位,而在LSB为1或0的情况下不触及其他位.
我有这个用于在java中的jpeg图像中编码数据.我正在将文本转换为二进制形式,并将其插入LSB(取决于用户选择的内容.1,2,3,4),每个像素中的RGB从(0,0)到(宽度,高度) .
outer:
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color c = new Color(image.getRGB(j, i));
int red = binaryToInteger(insertMessage(integerToBinary((int)(c.getRed())),numLSB));
int green = binaryToInteger(insertMessage(integerToBinary((int)(c.getGreen())),numLSB));
int blue = binaryToInteger(insertMessage(integerToBinary((int)(c.getBlue())),numLSB));
Color newColor = new Color(red,green,blue);
image.setRGB(j,i,newColor.getRGB());
}
}
gui.appendStatus("Binarized message is: " + binarizedMessage);
File output = new File(gui.getOutput()+".jpg");
ImageIO.write(image, "png", output);
Run Code Online (Sandbox Code Playgroud)
目前,我正在把它写成一个png,它运作良好,但我希望在jpeg中做到这一点.我成功地在png中获取这些数据.但正如预期的那样,jpeg失败了.
我能够解码所写图像中的隐藏位,并在选择正确的LSB时看到消息.
我目前正在阅读有关JPEG隐写术的内容,但我没有准确地了解它应该如何启动它.我见过算法,也没有帮助我.
我看到一个没有找到任何主类的代码.
我是否必须在我的应用程序中调用它?修改它?我怎么解码?
new_img = convert(img, text);
(img, text) = convert_back(new_img);
Run Code Online (Sandbox Code Playgroud)
有人可以用MATALB的内置图像来说明吗?
我目前正在研究一个steganogrpahy android应用程序作为一个类项目.我创建了一个对象,它将在另一个图像中编码图像并返回编码的位图.此代码在单独的线程中运行.
new Thread(new Runnable()
{
public void run()
{
Bitmap encoded_image = null;
Encryptor encryptor = new Encryptor();
encoded_image = encryptor.encode_image_in_image(
image_location,message_image_location);
}
}).start();
Run Code Online (Sandbox Code Playgroud)
在对位图进行编码之后,我将位图传递给我创建的文件浏览器活动,以将位图保存为png图像.此方法适用于较小的图像,但是,当编码大图像并将其传递给子活动时,应用程序会冻结并返回主活动.
private void pass_image_to_file_browser( Bitmap image )
{
Intent intent = new Intent(Encrypt.this,FileBrowser.class);
intent.putExtra( Intent.EXTRA_STREAM, image );
startActivity( intent );
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = this.getIntent().getExtras();
Bitmap image = bundle.getParacable(Intent.EXTRA_STREAM);
}
Run Code Online (Sandbox Code Playgroud)
我假设一个大的位图是使用意图在活动之间发送大的,所以我决定简单地将图像保存在临时位置并将图像的位置传递给子活动.然后将png图像保存在用户指定和删除临时图像文件的位置.
private void save_bitmap( Bitmap image, String location )
{
FileOutputStream fileOutputStream = new FileOutputStream(location);
BufferedOutputStream buffered_output_stream = …Run Code Online (Sandbox Code Playgroud) 我是python的新手,我正在尝试改进现有的在二进制图像中嵌入数据的方法,同时将视觉失真降至最低.我想要实现的当前方法需要具有以每个像素为中心的3x3移动窗口,并分析窗口内区域的平滑度以及黑色和白色簇的数量.然后,该信息将被传递到决策模块,该决策模块将决定要更改的最佳像素以嵌入数据.我玩过PIL和numPy,但没有太大的成功,所以任何建议让我开始将非常感激.
谢谢.
我使用http://github.com/anirudhsama将文本文件隐藏在图像中,它工作正常,我可以用我的程序再次提取文本文件.
但是当我以编程方式在Facebook,Twitter和电子邮件中共享图像时,该共享图像无法正确解码,因此我没有收回该文件.
我按如下方式检索图像:
UIImage *finalImageWithStegno = [UIImage imageWithContentsOfFile:fileName];
Run Code Online (Sandbox Code Playgroud) 我正在研究基于 LSB-DCT 的图像隐写术,其中我必须将 LSB 应用于图像的 DCT 系数以将数据嵌入到 JPEG。我对这一切都不熟悉。所以搜索并阅读了一些研究论文,他们都缺乏很多关于 DCT.i 之后过程的信息也在 stackoverflow 上阅读了许多问题和答案,并且变得更加困惑。
以下是问题:
1-研究论文和网络上的问题,他们都使用来自图像的 8x8 块大小进行 DCT ..如果图像的分辨率没有完全分成 8x8 块,如 724 x 520,我应该怎么做。520
/ 8 = 65 但是724 / 8 = 90.5
2-如果我有很多块和一些要隐藏的信息,我们认为它们可以放入 5 个块中..我是否仍然需要对剩余块和 idct 进行 dct。
3-我需要在 dct 之后应用量化然后应用 lsb 还是我可以直接应用 lsb ?
4 篇研究论文没有提到不涉及值为 0 和 1 以及第一个值的量化 dct 系数。现在我应该使用它们还是不使用它们?那么为何不??我知道它是 0,因为它是高频分量,并且在 JPEG 中被删除以进行压缩......而且我没有进行任何压缩......所以我可以使用它并仍然生成相同的 JPEG 文件吗???
5-in 量化我们将 DCT 系数与量化矩阵相除并四舍五入。相反,我必须将量化矩阵与 DCT 系数相乘......不能撤消四舍五入???
对于 DCT 和 IDCT 的评论:
我正在尝试完成 DCT 隐写术项目,但出现了一些有关它的问题。有人可以帮助我吗?我做了什么:
1)将图像分割成8x8像素
public BufferedImage[] getBlocksOfImage(BufferedImage image){
int width = image.getWidth();
int height = image.getHeight();
int arrayIndex = 0;
//TODO specify dynamic length
//TODO for 512x512 --> 4096 (8x8 block)
BufferedImage[] blocksOfImage = new BufferedImage[4096];
for (int i = 0; i<width; i=i+8) {
for (int j = 0; j<height; j=j+8) {
blocksOfImage[arrayIndex] = image.getSubimage(i,j,8,8);
arrayIndex++;
}
}
return blocksOfImage;
}
Run Code Online (Sandbox Code Playgroud)
2) 使用以下方法计算每个块的矩阵:
//get matrix of pixels (used in DCT]
public int[][] getMatrixPixels(BufferedImage image){
int[][] matrixPixels = new int[image.getWidth()][image.getHeight()];
for …Run Code Online (Sandbox Code Playgroud)