私はすべての質問を徹底的に調査しましたが、残念です!だから、ここに私の問題があります。私がやろうとしているのは、画像のRGB値のLSBを変更することです。getRGB() を使用して特定のピクセルの RGB 値を取得し、個々の R、G、および B の値を 8 ビットに変換し、LSB を別のソース (たとえばテキスト) からのビットに置き換えようとしています。 . 実例: @ pixel (0, 1) R=0111010, G=0011101 and B=1101001 そして、それらの LSB を 101 に置き換えたいと思います。つまり、新しい値は R=011101(1), G=001110(0) になります。 B=110100(1)。問題は、画像を処理して保存した後ですが、実際には保存されません。これが私のコードです
Scanner input = new Scanner(System.in);
System.out.print("Enter URL: ");
String imageURL = input.next();
File file = new File(imageURL);
BufferedImage image = ImageIO.read(file);
String flag = "011111000111110011";
int pixelX = 0;
int pixelY = 0;
for(int i=0; i<flag.length(); i+=3){
int pixel = image.getRGB(pixelX, pixelY);
int red = (pixel & 0x00ff0000) >> 16;
int green = (pixel & 0x0000ff00) >> 8;
int blue = pixel & 0x000000ff;
System.out.println("\n@ pixel: "+pixelX+pixelY+"\nred: "+red+"green: "+green+"blue: "+blue);
String binRed = roundTo8(Integer.toBinaryString(red));
String binGreen = roundTo8(Integer.toBinaryString(green));
String binBlue = roundTo8(Integer.toBinaryString(blue));
System.out.println("\nbinRed: "+binRed+"\nbinGreen: "+binGreen+"\nbinBlue: "+binBlue);
String flagRed = flag.substring(i, (i+1));
String flagGreen = flag.substring((i+1), (i+2));
String flagBlue = flag.substring((i+2), (i+3));
System.out.println("\nflagRed: "+flagRed+"\nflagGreen: "+flagGreen+"\nflagBlue: "+flagBlue);
if(!(flagRed.equals(binRed.charAt(7)))){
binRed = (binRed.substring(0, 7)).concat(flagRed);
System.out.print("\nnew binRed: "+binRed);
}
if(!(flagGreen.equals(binGreen.charAt(7)))){
binGreen = (binGreen.substring(0, 7)).concat(flagGreen);
System.out.print("\nnew binGreen: "+binGreen);
}
if(!(flagBlue.equals(binBlue.charAt(7)))){
binBlue = (binBlue.substring(0, 7)).concat(flagBlue);
System.out.print("\nnew binBlue: "+binBlue);
}
System.out.print("\nnew red: "+Integer.parseInt(binRed, 2));
System.out.print("\nnew green: "+Integer.parseInt(binGreen, 2));
System.out.print("\nnew blue: "+Integer.parseInt(binBlue, 2));
System.out.println("==========");
//
int newRed = Integer.parseInt(binRed, 2);
int newGreen = Integer.parseInt(binGreen, 2);
int newBlue = Integer.parseInt(binBlue, 2);
Color clr = new Color(newRed, newGreen, newBlue);
int temp = clr.getRGB();
image.setRGB(pixelX, pixelY, temp);
try {
File outputfile = new File("saved.jpg");
ImageIO.write(image, "jpg", outputfile);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "An error occured while saving the steg file.", "Error", JOptionPane.ERROR_MESSAGE);
}
pixelX++;
}
そして、私はこのコードを使用して上記のコードをテストしました:
Scanner input = new Scanner(System.in);
System.out.print("Enter URL: ");
String imageURL = input.next();
File file = new File(imageURL);
BufferedImage image = ImageIO.read(file);
for(int j=0; j<45; j++){
int pixel = image.getRGB(j, 0);
int red = (pixel & 0x00ff0000) >> 16;
int green = (pixel & 0x0000ff00) >> 8;
int blue = pixel & 0x000000ff;
String binRed = roundTo8(Integer.toBinaryString(red));
String binGreen = roundTo8(Integer.toBinaryString(green));
String binBlue = roundTo8(Integer.toBinaryString(blue));
System.out.print(binRed.charAt(7)+""+binGreen.charAt(7)+binBlue.charAt(7)+" ");
}