/ / ImageIO.writeでファイル(JPG)を保存する際のjava.awt.Colorの処理-Java、色

ImageIO.writeでファイル(JPG)を保存している間のjava.awt.Colorの処理 - java、colors

Courseraコースに参加して、私は ステガノグラフィー 別の画像を非表示にします。 これは、「メイン」ピクチャのRGB値を6ビットに、「セカンド」ピクチャの値を最後の2ビットに保存しようとしたことを意味します。 これら2つの値を結合して結合画像を作成し、結合画像を解析して元の画像を復元するクラスもコーディングしました。

イメージの回復は成功していませんが、(コース内で提供される他の例から)パーサーは正常に動作しているようです。 ImageIO.writeを使用して、変更後に画像を保存すると、コードで慎重に設定したRGB値が何らかの形で変更されると思います。 :D

public static BufferedImage mergeImage(BufferedImage original,
BufferedImage message, int hide) {
// hidden is the num of bits on which the second image is hidden
if (original != null) {
int width = original.getWidth();
int height = original.getHeight();
BufferedImage output = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int pix_orig = original.getRGB(i, j);
int pix_msg = message.getRGB(i, j);
int pixel = setpixel(pix_orig, pix_msg, hide);
output.setRGB(i, j, pixel);
}
}
return output;
}
return null;
}

public static int setpixel(int pixel_orig, int pixel_msg, int hide) {
int bits = (int) Math.pow(2, hide);
Color orig = new Color(pixel_orig);
Color msg = new Color(pixel_msg);
int red = ((orig.getRed() / bits) * bits); //+ (msg.getRed() / (256/bits));
if (red % 4 != 0){
counter+=1;
}
int green = ((orig.getGreen() / bits) * bits) + (msg.getGreen() / (256/bits));
int blue = ((orig.getBlue() / bits) * bits) + (msg.getBlue() / (256/bits));
int pixel = new Color(red, green, blue).getRGB();
return pixel;
}

これは、RGB値の設定に使用するコードですマージされた画像の。ご覧のように、赤に属するコードの一部をコメントして、メイン画像を実際に6ビットで保存できるかどうかを確認しました。

int hide = 2
ただし、コードの解析部分で同じチェックを行うと:

    public static BufferedImage parseImage(BufferedImage input, int hidden){
// hidden is the num of bits on which the second image is hidden
if (input != null){
int width = input.getWidth();
int height = input.getHeight();
BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for(int i=0;i<width;i++){
for(int j=0;j<height;j++){
int pixel = input.getRGB(i, j);
pixel = setpixel(pixel,hidden);
output.setRGB(i, j, pixel);
}
}
return output;
}
return null;
}

public static int setpixel(int pixel, int hidden){
int bits = (int) Math.pow(2,hidden);
Color c = new Color(pixel);
if (c.getRed() % 4 != 0){
counter+=1;
}
int red = (c.getRed() - (c.getRed()/bits)*bits)*(256/bits);
int green = (c.getGreen() - (c.getGreen()/bits)*bits)*(256/bits);
int blue = (c.getBlue() - (c.getBlue()/bits)*bits)*(256/bits);
pixel = new Color(red,green,blue).getRGB();
return pixel;
}

R値が4で割った場合の余り。 ImageIO.writeの機能に問題があると思われます。 質問はあいまいになると思いますが、 1)誰かがこれを確認できますか 2)このコードを機能させるにはどうすればよいですか?

どうもありがとう!

回答:

回答№1は1

JPEGには非可逆圧縮があります。つまり、画像の再読み込み時にいくつかのピクセルが効果的に変更されます。これは「t」の欠点ではありません ImageIO.write、それは形式の仕組みです。データをピクセル値に直接埋め込む場合は、BMPやPNGなどの可逆形式に画像を保存します。