2010-01-06 5 views
0

У меня есть проблема с преобразованием массива байтов в двойной массив с использованием BitConverter.ToDouble().Проблема для преобразования байтового массива в double

Просто моя программа выберет изображение, а затем преобразует изображение в массив байтов. Затем он преобразует массив байтов в двойной массив.

Проблема, что при преобразовании массива байтов в 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]; 
} 

Edit - или с помощью 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

Думаю, вам нужно немного подружиться и объяснить, что вы на самом деле пытаетесь сделать. Каждый битконвертер.ToDouble преобразует 8 последовательных байтов в 1 двойную. Если вы начинаете с следующей позиции в массиве байтов, вы используете 7 байтов, которые уже были использованы. Поскольку каждое преобразование потребуется 8 байт, то вам нужно остановиться на Длина - 7.

Во всяком случае, вы будете в конечном итоге раздувания размер данных с коэффициентом 8.

Я думаю, что какое-то объяснение для чего это может помочь вам получить несколько лучших ответов.

+0

Спасибо, ребята, за ответ. То, что мне нужно, это создать массив, чтобы использовать его для работы с самоорганизующимися картами нейронной сети в качестве входного массива. передать изображение в нейронную сеть. – Eyla

1

Программа класса { статической силы основных (String [] арг) {

 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); 
       } 



      } 





    } 
} 
Смежные вопросы