gpt4 book ai didi

java - 有没有办法将 getRGB 和 setRGB 与隐写术一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:07 26 4
gpt4 key购买 nike

我正在编写一个带有简单隐写术实现的程序。

我有一个问题,因为如果我对一个像素使用 setRGB 然后 getRGB 我会得到不同的值。我读到 setRGB 和 getRGB 不是字节和位操作的最佳主意,但也许有办法吗?我想使用每个像素的 alpha 红绿和蓝色的 LSB,但我不知道如何使用光栅来实现这一点,说实话,我花了很多时间编写一些代码来生成正确的 TYPE_INT_ARGB 值...我想使用 ARGB 中的每 2 个 LSB,因此我有 8 位像素 - 这为像素提供了一个字符。

System.out.println("ARGB in int befor edit: " + obraz.getRGB(0, 0));
int RGB = obraz.getRGB(0, 0);
int alpha = (RGB >> 24) & 0xFF;
int red = (RGB >> 16) & 0xFF;
int green = (RGB >> 8) & 0xFF;
int blue = (RGB) & 0xFF;

System.out.println("RGB: " + RGB);
System.out.println("alpha: " + alpha);
System.out.println("red: " + red);
System.out.println("green: " + green);
System.out.println("blue: " + blue);

System.out.println("After:");
int newARGB = addLetter(RGB, 'b'); //this change every two bits of ARGB
int alpha2 = (newARGB >> 24) & 0xFF;
int red2 = (newARGB >> 16) & 0xFF;
int green2 = (newARGB >> 8) & 0xFF;
int blue2 = (newARGB) & 0xFF;


obraz.setRGB(0,0,newRGB);

System.out.println("ARGB in int after edition: " + obraz.getRGB(0, 0));
int RGB3 = obraz.getRGB(0, 0);
int alpha3 = (RGB3 >> 24) & 0xFF;
int red3 = (RGB3 >> 16) & 0xFF;
int green3 = (RGB3 >> 8) & 0xFF;
int blue3 = (RGB3) & 0xFF;

System.out.println("RGB: " + RGB3);
System.out.println("alpha: " + alpha3);
System.out.println("red: " + red3);
System.out.println("green: " + green3);
System.out.println("blue: " + blue3);

结果不同,因此隐写术不起作用......

这是 addLetter 函数

    public static int addLetter(int i, char letter)
{
byte tym, tc;
tc = (byte) letter;
int ARGB;


byte byte3 = (byte) ((i & 0xFF000000) >> 24);
byte3 = (byte) (byte3 & (~0x00000003));
tym = (byte) ((tc & 0xC0) >> 6);
byte3 = (byte) (byte3 | tym);


byte byte2 = (byte) ((i & 0x00FF0000) >> 16);
byte2 = (byte) (byte2 & (~0x00000003));
tym = (byte) ((tc & 0x30) >> 4);
byte2 = (byte) (byte2 | tym);

byte byte1 = (byte) ((i & 0x0000FF00) >> 8);
byte1 = (byte) (byte1 & (~0x00000003));
tym = (byte) ((tc & 0x0C) >> 2);
byte1 = (byte) (byte1 | tym);

byte byte0 = (byte) ((i & 0x000000FF));
byte0 = (byte) (byte0 & (~0x00000003));
tym = (byte) ((tc & 0x03));
byte0 = (byte) (byte0 | tym);

byte[] wynik = (new byte[]{byte3, byte2, byte1, byte0});
return ByteBuffer.wrap(wynik).getInt();

如果您有任何帮助和理解,我将不胜感激。我还是 Java 初学者

编辑:

我会再次尝试解释我的问题:我正在使用函数//int i - im 传递像素的 getRGB 结果//char letter - 这是一个我添加到 A、R、G 和 B 值的 2 LSB 的字母公共(public)静态 int addLetter(int i, char letter) { 字节tym,tc; tc =(字节)字母; int ARGB;

    byte byte3 = (byte) ((i & 0xFF000000) >> 24);
byte3 = (byte) (byte3 & (~0x00000003));
tym = (byte) ((tc & 0xC0) >> 6);
byte3 = (byte) (byte3 | tym);


byte byte2 = (byte) ((i & 0x00FF0000) >> 16);
byte2 = (byte) (byte2 & (~0x00000003));
tym = (byte) ((tc & 0x30) >> 4);
byte2 = (byte) (byte2 | tym);

byte byte1 = (byte) ((i & 0x0000FF00) >> 8);
byte1 = (byte) (byte1 & (~0x00000003));
tym = (byte) ((tc & 0x0C) >> 2);
byte1 = (byte) (byte1 | tym);

byte byte0 = (byte) ((i & 0x000000FF));
byte0 = (byte) (byte0 & (~0x00000003));
tym = (byte) ((tc & 0x03));
byte0 = (byte) (byte0 | tym);

byte[] result = (new byte[]{byte3, byte2, byte1, byte0});
return ByteBuffer.wrap(result).getInt();
}

问题是,在我使用 setRGB 将其传递给 BufferedImage 后,它更改的值与我想要的不同。我用另一个 getRGB 检查它,值略有不同,所以我无法读取隐藏的字母。

最佳答案

您可能遇到问题:

tym = (byte) ((tc & 0xC0) >> 6);

如果tc(这是一个字节)是1100 0100,则掩码将给出1100 0000并且使用 >> 运算符右移 6 将给出... 1111 1111!

不确定这是否是您真正的意思。如果您想要的是 0000 0011 那么您必须使用 >>>>> 运算符携带符号位。

关于java - 有没有办法将 getRGB 和 setRGB 与隐写术一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com