간단한 스테 가노 그래피 구현으로 프로그램을 작성합니다.스테 가노 그라피와 함께 getRGB와 setRGB를 사용할 방법이 있습니까?
setRGB를 사용하고 한 픽셀에 대해 getRGB를 사용하면 다른 값을 가지기 때문에 문제가 발생합니다. setRGB 및 getRGB는 바이트 및 비트 연산에 대한 최선의 아이디어가 아니지만 방법이있을 수 있습니다. 나는 모든 픽셀의 알파 레드 그린과 블루의 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);
결과는
이
내가 어떤 도움과 이해에 대한 greatefull 될 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();
입니다 ... 그래서 stegenography이 작동하지 않습니다 다릅니다. 자바
에서 메신저 아직도 beginer에 편집 :
나는 내 문제를 한 번 더 설명하려고합니다 : 기능 를 사용 임 // 내가 int로 - 픽셀 // 문자 문자에 대한 getRGB를의 메신저 통과 결과를 - 즉, A, R, G 및 B 값의 2 LSB를 더하는 문자 public static 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와 값에 의해 그것을 확인하고 있습니다.
그냥 제안 사항입니다. 영어 이름을 (모든) 변수에 부여하면 다른 사람들이 문제를 더 잘 이해할 수 있습니다. – Bono
'obraz'의 데이터 유형은 무엇입니까? – karlphillip
obraz is BufferedImage 죄송합니다, obraz는 이미지입니다. zastap2ostatnie는 change2last입니다. – wiwo