Проблема преобразования байтового массива в двойной - PullRequest
0 голосов
/ 06 января 2010

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

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

Проблема в том, что при преобразовании байтового массива в двойной я получу эту ошибку до завершения цикла.

(Массив назначения недостаточно длинный, чтобы скопировать все элементы в коллекции. Проверьте индекс и длину массива.)

Ошибка возникает точно в массиве. Длина-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();
}

Ответы [ 3 ]

6 голосов
/ 06 января 2010
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);
}

Опять же, основываясь на вашем коде, я думаю, что первое решение - это то, что вам нужно.

1 голос
/ 25 октября 2010

Программа занятий { static void Main (строка [] 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);
                }



            }





    }
}
0 голосов
/ 06 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...