0

この段落を Web サイトから読み取ろうとしましたが、「元の文字列を作成するために必要なバイト値を再構築するために必要なビットを 32 番目のピクセルに格納する」理由がわかりません。

これは、メッセージをアルファ (透明度) (ARGB) にしようとしています

以下のこのコードでは、整数とバイトの両方を埋め込む必要があるのはなぜですか

 int imageWidth = img.getWidth(), imageHeight = img.getHeight(),
 imageSize = imageWidth * imageHeight;
 if(messageLength * 8 + 32 > imageSize) {
    JOptionPane.showMessageDialog(this, "Message is too long for the chosen image",
       "Message too long!", JOptionPane.ERROR_MESSAGE);
    return;
   }
   embedInteger(img, messageLength, 0, 0);

   byte b[] = mess.getBytes();
   for(int i=0; i<b.length; i++)
      embedByte(img, b[i], i*8+32, 0);
   }

 private void embedInteger(BufferedImage img, int n, int start, int storageBit) {
   int maxX = img.getWidth(), maxY = img.getHeight(), 
      startX = start/maxY, startY = start - startX*maxY, count=0;
   for(int i=startX; i<maxX && count<32; i++) {
      for(int j=startY; j<maxY && count<32; j++) {
         int rgb = img.getRGB(i, j), bit = getBitValue(n, count);
         rgb = setBitValue(rgb, storageBit, bit);
         img.setRGB(i, j, rgb);
         count++;
         }
      }
   }

private void embedByte(BufferedImage img, byte b, int start, int storageBit) {
   int maxX = img.getWidth(), maxY = img.getHeight(), 
      startX = start/maxY, startY = start - startX*maxY, count=0;
   for(int i=startX; i<maxX && count<8; i++) {
      for(int j=startY; j<maxY && count<8; j++) {
         int rgb = img.getRGB(i, j), bit = getBitValue(b, count);
         rgb = setBitValue(rgb, storageBit, bit);
         img.setRGB(i, j, rgb);
         count++;
         }
      }
   }
4

1 に答える 1

1

メッセージを抽出するために読み取るピクセル数がわかるように、メッセージの長さを保存する必要があります。メッセージの長さは予測できないため、32 ビット (最初の 32 ピクセル) が割り当てられます。

関数mbedIntegerとembedByteはほぼ同じです。

  • embedIntegerメッセージの長さを最初の 32 ピクセルに埋め込む処理を行います。
  • embedByteメッセージ文字を 1 つずつ埋め込みます。呼び出されるたびに、メッセージの次の文字をバイト形式で入力として受け取りますb[i]。そこでは、1 ピクセルあたり 1 ビットが埋め込まれ、1 バイトあたり合計 8 ビットになります。
于 2014-01-21T15:00:21.147 に答える