2010-01-06 28 views
0

我有一個問題,使用BitConverter.ToDouble()將字節數組轉換爲雙數組。轉換字節數組爲雙倍的問題

只要我的程序將選擇一個圖像,然後將圖像轉換爲字節數組。 然後它會將字節數組轉換爲雙數組。

當我將字節數組轉換爲double時,在循環完成之前會出現此錯誤。

(目標數組不夠長,所有的項目複製收藏。檢查數組索引和長度。)

誤差在array.Length-7位究竟發生是之前的最後一個最後的第七位在陣列上的位置。

我需要幫助解決這個問題,這裏是我的代碼:

private Bitmap loadPic; 
byte[] imageArray; 
double[] dImageArray; 

private void btnLoad_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     OpenFileDialog open = new OpenFileDialog(); 
     open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; 

     if (open.ShowDialog() == DialogResult.OK) 
     { 
      pictureBox1.Image = new Bitmap(open.FileName); 
      loadPic = new Bitmap(pictureBox1.Image); 
     } 
    } 
    catch 
    { 
     throw new ApplicationException("Failed loading image"); 
    } 

    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
} 

private void btnConvert_Click(object sender, EventArgs e) 
{ 
    imageArray = imageToByteArray(loadPic); 
    int index = imageArray.Length; 
    dImageArray = new double[index]; 

    for (int i = 0; i < index; i++) 
    { 
     dImageArray[i] = BitConverter.ToDouble(imageArray,i); 
    } 
} 

public byte[] imageToByteArray(Image imageIn) 
{ 
    MemoryStream ms = new MemoryStream(); 
    imageIn.Save(ms, ImageFormat.Gif); 
    return ms.ToArray(); 
} 

回答

6
BitConverter.ToDouble(byte[], int) 

使用八個字節來構建一個64位雙,這說明您的問題(一旦你到了7日最後一個元素,不再有八個字節)。我猜這是而不是你想要做什麼,根據你如何設置你的循環。

我想像你想要的東西,如:

for(int i = 0; i < index; i++) 
{ 
    dImageArray[i] = (double)imageArray[i]; 
} 

編輯 - 或使用LINQ,只是爲了好玩:

double[] dImageArray = imageArray.Select(i => (double)i).ToArray(); 

在另一方面...

如果BitConverter絕對是你想要的,那麼你需要像這樣的東西:

double[] dImageArray = new double[imageArray.Length/8]; 
for (int i = 0; i < dImageArray.Length; i++) 
{ 
    dImageArray[i] = BitConverter.ToDouble(imageArray, i * 8); 
} 

再次,根據您的代碼,我認爲第一個解決方案就是您需要的。

+0

不,這不是它。您正在使用演員陣容,這將產生與BitConverter完全不同的結果。 –

+1

我剛剛澄清了我的帖子,指出基於他的循環(和他的數組初始化),我不認爲BitConverter是他想要的。 – Sapph

+0

是的,我認爲你是對的。 +1 –

0

我認爲你需要備份一下並解釋你實際上想要做什麼。每個BitConverter.ToDouble將8個連續字節轉換爲1個雙精度型。如果從字節數組的下一個位置開始,則使用已使用的7個字節。由於每次轉換都需要8個字節,則需要在長度停止 - 7

不管怎樣,你要結束了由8

的因素,我認爲一些解釋充氣數據的大小這是什麼可能會幫助你得到一些更好的答案。

+0

謝謝各位回覆。 我所需要的就是創建一個數組來使用它來處理自組織映射神經網絡作爲輸入數組。 將圖像傳遞到神經網絡。 – Eyla

1

類節目 { 靜態無效的主要(字串[] args){

 Program p = new Program(); 
     p.Test(); 
    } 

    private void Test() 
    { 

     Image i = Image.FromFile(@"C:\a.jpg"); 

     Bitmap b = new Bitmap(i); 

     MemoryStream ms = new MemoryStream(); 

     b.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 

     byte[] by = ms.ToArray(); 

     double[] db = new double[(int)(Math.Ceiling((double)by.Length/8))]; 



     int startInterval = 1; 
     int interval = 8; 
     int k = 0; 
     byte[] bys = new byte[8]; 
     int n = 1; 

      for (int m = startInterval; m <= interval && m<=by.Length; m++,n++) 
      { 
       bys[n-1] = by[m-1]; 


       if (m == interval) 
       { 


        db[k] = BitConverter.ToDouble(bys, 0); 
        startInterval += 8; 
        interval += 8; 
        k++; 
        n = 0; 
        Array.Clear(bys, 0, bys.Length); 

       } 

       if (m == by.Length) 
       { 
        db[k] = BitConverter.ToDouble(bys, 0); 
       } 



      } 





    } 
}