1

画像内の文字列をエンコードする画像暗号化プログラムを作成しています。

私は.png画像を扱っています。

エンコードは次の手順で実行されます。

  • イメージのピクセルは、getRGB() を使用して 2D 配列に格納されます。
  • 文字列内の各文字はバイナリ形式に変換され、配列に格納されます。
  • ピクセルのすべてのバイトの LSB は4byte、文字のバイナリ形式のすべてのビットに従って変更されます。最初のバイトの LSB は 0 番目の位置、2 番目のバイトの LSB は 8 番目の位置、3 番目のバイトは 16 番目の位置、4 番目のバイトは 24 番目の位置です。
  • エンコード後、変更されたピクセルは setRGB() メソッドを使用して元の画像に書き込まれます。

デコードの場合:

  • getRGB(); を使用して画像のピクセルを読み取ります。
  • データの取得には、逆のエンコード方法が適用されます。
  • 8 ビットごとに、デコードされたビットを含む int が文字に変換されます。次に、他の文字のゼロで初期化されます。

                if((pixels[i][j] & change)==1)  
                {
                    tempText|=1 ;
                }
    
                tempText<<=1;
    

変化は反復に応じて 1,256,65536,16777216 です。0 番目、8 番目、16 番目、24 番目のビットが 1 です。

コードは正常にコンパイルされます。しかし、デコードした後、出力に奇妙なASCII文字が表示されます。この理由を見つけることができませんでした。だから私はここで専門家に相談しています。

4

1 に答える 1

0

(これはコメントするには長すぎます)

あなたが書いた:

int change = 0;

                            for(int k=0;k<4;k++)
                            {
                                    if(k==0)
                                    {
                                            change=1;
                                    }
                                    else
                                            if(k==1)
                                            {
                                                    change=256;
                                            }
                                            else
                                                    if(k==2)
                                                    {
                                                            change=65536;
                                                    }
                                                    else
                                                            if(k==3)
                                                            {
                                                                    change = 16777216;
                                                            }

そして、そこにはたくさんの繰り返しがあります。通常、コンピューターは繰り返しをなくすのに非常に優れています。

私がこのワンライナーに惑わされていなければ、これは書き直すことができます:

final int change = 1 << 8 * k;
于 2013-01-20T17:46:29.733 に答える