如何根据我的消息更改每个像素的LSB

时间:2015-03-15 00:14:41

标签: java arrays steganography

我正在尝试实现一个简单的编码程序,我可以在图像像素的LSB中隐藏消息。到目前为止,我已经从消息中获得了字节数组

    private static byte[] ConvertMessageToByte(String message,
        byte[] messageBytes) {
    // takes in the message and stores them into bytes
    // returns message byte array
    byte[] messageByteArray = message.getBytes();

    return messageByteArray;

}

我还得到了我要编码到

的相应图像的字节数组
    private static byte[] getPixelByteArray(BufferedImage bufferedImage) {

    WritableRaster raster = bufferedImage.getRaster();

    DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();

    return buffer.getData();

}

直到这一点,我不太了解以后的步骤。我是否遍历图像字节数组并将每个ARGB值存储在另一个字节数组中?另外,我如何将消息位值应用于像素?

1 个答案:

答案 0 :(得分:0)

private static byte[] ConvertMessageToByte(String message, byte[] messageBytes) {
    byte[] messageByteArray = message.getBytes();
    return messageByteArray;
}

关于这个方法:convertMessageToBytes是一个更好的名称,因为小写的第一个字母更常规,以及你生成一个多字节而不仅仅是一个字节的事实。此方法不需要第二个byte[]参数,因为它可以简化为return message.getBytes();并产生相同的效果。此外,String.getBytes()通常在其父函数中调用,因为它不被广泛认为值得包装,因为它是一行。总之:删除此方法并在主代码中使用byte[] ba = s.getBytes();

就个人而言,我将图像处理为3_BYTE_RGB,因为它们是最常被认为的,并且实际上在物理监视器或打印机上表示并存储在许多图像格式的情况下。 HSL(LSB)通常是颜色的用户端表示。你应该考虑RGB而不是HSL。

不要将图像作为byte[]处理,而是使用int BufferedImage.getRGB(int x, int y),因为它更容易操作且更容易访问。 以下功能可能有用。我会让你反过来写。

private static int[] getColourAt(BufferedImage image, int x, int, y) {
  int rgb = image.getRGB(x, y);
  int r = rgb >> 16;
  int g = (rgb >> 8) % 256;
  int b = rgb % 256;
  return new int[] {r, g, b};
}

从那里开始,你应该遍历每个像素并根据需要进行调整。