2010-12-14 2 views
2

バイト[]をC#のイメージに変換しようとしています。私はこの質問が別のフォーラムで尋ねられたことを知っています。しかし、彼らに与えられた答えのどれも私を助けませんでした。いくつかのコンテキスト= を与えるには、画像を開き、それをバイト[]に変換します。私はバイト[]を暗号化します。結局私はまだバイト[]を持っていますが、それは修正されました。もう一度これを表示したいと思います。バイト[]自体は6559バイトで構成されています。私は次のようにして変換しようとしています。配列を変更した後、バイト配列をC#のImageに変換します。

public Image byteArrayToImage(byte[] byteArrayIn) 
    { 
     MemoryStream ms = new MemoryStream(byteArrayIn); 
     Image returnImage = Image.FromStream(ms); 
     return returnImage; 
    } 

このエラーが発生します。パラメータが無効です。

バイト配列

List<byte> encryptedText = new List<byte>();  
pbEncrypted.Image = iConverter.byteArrayToImage(encryptedText.ToArray()) 

リストに.toArray()を使用して構成されています。

誰でも手伝ってもらえますか?私は何らかの形式や何かを忘れていますか?

画像に変換する必要があるバイト: alt text

private void executeAlgoritm(byte[] plainText) 
    { 

     // Empty list of bytes 
     List<byte> encryptedText = new List<byte>(); 

     // loop over all the bytes in the original byte array gotten from the image 
     foreach (byte value in plainText) 
     { 
      // convert it to a bitarray 
      BitArray myBits = new BitArray(8); //define the size 

      for (byte x = 0; x < myBits.Count; x++) 
      { 
       myBits[x] = (((value >> x) & 0x01) == 0x01) ? true : false; 
      } 

      // encrypt the bitarray and return a byte 
      byte bcipher = ConvertToByte(sdes.IPInvers(sdes.FK(sdes.Shift(sdes.FK(sdes.IP(myBits),keygen.P8(keygen.shift(keygen.P10(txtKey.Text))))),keygen.P8(keygen.shift(keygen.shift(keygen.shift(keygen.P10(txtKey.Text)))))))); 

      // add the byte to the list 
      encryptedText.Add(bcipher); 

     } 
     // show the image by converting the list to an array and the array to an image 
     pbEncrypted.Image = iConverter.byteArrayToImage(encryptedText.ToArray()); 
    } 
+0

バイト[]を復号するのを忘れましたか?画像をバイト[]、暗号化/復号/変更に変換するコードコードをすべて投稿できますか?あなたが掲示したコードは何が間違っているかを判断するのに十分ではありません。 – cdhowie

+0

暗号化された画像を表示する必要があるので、復号化する必要はありません。しかし、暗号化はバイト単位でビットをスワップするだけです(sDES)。私はまだ最後にバイト[]があり、この暗号化されたイメージを表示することが可能でなければなりません。 – Ojtwist

+0

最初に 'byte []'に変換しましたか? –

答えて

3

ヘッダーをスキップし、画像のみを暗号化する必要があります。 これは、暗号化されたイメージが作成される新しいbytearrayにbytearrayの最初の54バイトをコピーすることによって行うことができます。 イメージ内の他のすべてのバイトをループして、それらを暗号化するとします。このような 何か:

 for (int i = 0; i < img.Length; i++) 
     { 
      if (i < 54) 
      { 
       //copy the first 54 bytes from the header 
       _cyph[i] = img[i]; 
      }else{ 
       //encrypt all the other bytes 
       _cyph[i] = encrypt(img[i]); 
      } 
     } 

最後には、あなたがイメージにbytearrayのを変換するために使用されるコードを使用します。

私はこれがあなたのために働くことを願っています!

9

はこのような何かを試してみてください。画像やメモリストリームを扱うときは、オブジェクトが正しく配置されていることを確認するために、ステートメントを使用してすべてをラップするようにしてください。

public static Image CreateImage(byte[] imageData) 
{ 
    Image image; 
    using (MemoryStream inStream = new MemoryStream()) 
    { 
     inStream.Write(imageData, 0, imageData.Length); 

     image = Bitmap.FromStream(inStream); 
    } 

    return image; 
} 
4

質問とコメントに基づいて、イメージヘッダーに関連付けられたバイトを変更していると思います。これらのバイトは(暗号化方式で)変更できず、イメージを読み込むことができません。

ヘッダーバイトを変更していないことを確認してください。

google/wikipediaでヘッダー形式について知ることができます。

1

@ Booさんの回答に追加するには、Bitmap.LockBitsメソッドを使用して、生の画像データ(マイナスヘッダー)を取得することができます。このように画像を操作する例はMSDN page on the BitmapData classです。

関連する問題