Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 隐写术,只有jpg作为输入工作,当使用png时,生成的图像看起来很奇怪_Java_Image_Png_Steganography - Fatal编程技术网

Java 隐写术,只有jpg作为输入工作,当使用png时,生成的图像看起来很奇怪

Java 隐写术,只有jpg作为输入工作,当使用png时,生成的图像看起来很奇怪,java,image,png,steganography,Java,Image,Png,Steganography,我构建了一个小java程序,它使用最低有效位方法在图像中隐藏消息。输入jpg文件时,它工作正常。输出可以是png或jpg。当输入png时,结果看起来很奇怪 以下分别是原始图像和结果图像: 错误源于png图像具有额外的透明度通道System.out.println(像素长度)返回jpg的338355字节和png的451140字节 最简单的解决方案是根据格式文件创建适当的imageNew。比如说, int w = image.getWidth(); int h = image.getHeight

我构建了一个小java程序,它使用最低有效位方法在图像中隐藏消息。输入jpg文件时,它工作正常。输出可以是png或jpg。当输入png时,结果看起来很奇怪

以下分别是原始图像和结果图像:


错误源于png图像具有额外的透明度通道<代码>System.out.println(像素长度)返回jpg的338355字节和png的451140字节

最简单的解决方案是根据格式文件创建适当的
imageNew
。比如说,

int w = image.getWidth();
int h = image.getHeight();
BufferedImage imageNew = null;
if (imageSource.matches(".*jpg$")) {
    imageNew = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
} else if (imageSource.matches(".*png$")) {
    imageNew = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
} else {
    // whatever
}
imageNew.setData(Raster.createRaster(imageNew.getSampleModel(), new DataBufferByte(pixelsBinNew, pixelsBinNew.length), new Point()));
但是,您必须注意,消息并不是嵌入在同一像素的两种类型中。3通道图像的字节数组(无透明度)如下所示

first-pixel-BLUE, first-pixel-GREEN, first-pixel-RED, second-pixel-BLUE, etc
而对于4通道图像

first-pixel-ALPHA, first-pixel-BLUE, first-pixel-GREEN, first-pixel-RED, second-pixel-ALPHA, etc

如果您关心这个细节,您可能会首先对它感兴趣,因此您总是使用3通道图像。

错误源于png图像有一个额外的通道用于透明度<代码>System.out.println(像素长度)返回jpg的338355字节和png的451140字节

最简单的解决方案是根据格式文件创建适当的
imageNew
。比如说,

int w = image.getWidth();
int h = image.getHeight();
BufferedImage imageNew = null;
if (imageSource.matches(".*jpg$")) {
    imageNew = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
} else if (imageSource.matches(".*png$")) {
    imageNew = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
} else {
    // whatever
}
imageNew.setData(Raster.createRaster(imageNew.getSampleModel(), new DataBufferByte(pixelsBinNew, pixelsBinNew.length), new Point()));
但是,您必须注意,消息并不是嵌入在同一像素的两种类型中。3通道图像的字节数组(无透明度)如下所示

first-pixel-BLUE, first-pixel-GREEN, first-pixel-RED, second-pixel-BLUE, etc
而对于4通道图像

first-pixel-ALPHA, first-pixel-BLUE, first-pixel-GREEN, first-pixel-RED, second-pixel-ALPHA, etc

如果你关心这个细节,你可能会对第一个感兴趣,因此你总是在处理三通道图像。

如果你清理了意大利面代码,它将更容易阅读,从而更容易理解和发现问题;为你和我们。我可以很容易地检查一个5行的方法并给出一个关于正确性的声明,但对于一个40行的方法来说很难。帮你自己一个忙,把大的方法分成小的部分。从文件名中提供位图的前11行开始,移动更接近用法的变量,例如,
w
h
似乎在接下来的16行中没有使用。这让我怀疑它们是否被使用过。如果没有使用,请将其删除。另外:你说图片看起来有问题。这告诉我问题出在加密方法上。解密方法应该与问题无关。移除它。最后,在我离开这里之前,这里有太多的
String
s。如果一个需要位操作的操作使用了这么多的字符串和这么少的字节,那就是出了问题。好的,谢谢,我会尽快解决的!如果你清理了意大利面代码,它将更容易阅读,从而更容易理解和发现问题;为你和我们。我可以很容易地检查一个5行的方法并给出一个关于正确性的声明,但对于一个40行的方法来说很难。帮你自己一个忙,把大的方法分成小的部分。从文件名中提供位图的前11行开始,移动更接近用法的变量,例如,
w
h
似乎在接下来的16行中没有使用。这让我怀疑它们是否被使用过。如果没有使用,请将其删除。另外:你说图片看起来有问题。这告诉我问题出在加密方法上。解密方法应该与问题无关。移除它。最后,在我离开这里之前,这里有太多的
String
s。如果一个需要位操作的操作使用了这么多的字符串和这么少的字节,那就是出了问题。好的,谢谢,我会尽快解决的!