«Неуказанная ошибка» при преобразовании байтового массива в BitmapImage - PullRequest
1 голос
/ 01 февраля 2012

Моя цель - загружать и скачивать изображения с помощью веб-сервиса. Я понимаю, что для этого изображения должны быть преобразованы в байтовый массив. Тем не менее, я получаю «Unspecified error» при преобразовании байтового массива в BitmapImage.

Я создал тестовую установку, которая преобразует изображение (из PhotoChooserTask) в байтовый массив и обратно, что воссоздает мою проблему. Код, который выполняет преобразование, указан ниже с выделенной строкой проблемы.

Любая помощь будет оценена!

private void PhotoChooserTaskCompleted(object sender, PhotoResult e)
{

    if (e.TaskResult == TaskResult.OK)
    {
        //Display the photo
        BitmapImage PhotoBitmap = new BitmapImage();
        PhotoBitmap.SetSource(e.ChosenPhoto);
        Photo.Source = PhotoBitmap;

        //Convert the photo to bytes
        Byte[] PhotoBytes = new byte[e.ChosenPhoto.Length];
        e.ChosenPhoto.Read(PhotoBytes, 0, PhotoBytes.Length);

        //Convert the bytes back to a bitmap
        BitmapImage RestoredBitmap = new BitmapImage();
        MemoryStream stream = new MemoryStream(PhotoBytes);
        BitmapImage image = new BitmapImage();
        RestoredBitmap.SetSource(stream);    //<------ I get "Unspecified error" on this line

        //Display the restored photo
        RestoredPhoto.Source = RestoredBitmap;
    }
}

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

При первом использовании e.ChosePhoto в качестве источника читается поток, а свойство Position продвигается до конца.Вы можете проверить массив PhotoBytes в отладчике, чтобы увидеть, что после вашей операции чтения он фактически не имеет никакого содержимого (или проверить возвращаемое значение метода Read, чтобы подтвердить чтение нулевых байтов).

Что вам нужно сделать, это сбросить Position на ноль, прежде чем читать с него снова:

//Convert the photo to bytes
Byte[] PhotoBytes = new byte[e.ChosenPhoto.Length];

// rewind first
e.ChosenPhoto.Position = 0;

// now succeeds
e.ChosenPhoto.Read(PhotoBytes, 0, PhotoBytes.Length);
0 голосов
/ 01 февраля 2012

Ты проверил мой другой пост, где я уже сделал это?Я получил довольно хороший рейтинг от него.

BitmapImage для byte [] и byte [] для BitmapImage

0 голосов
/ 01 февраля 2012

Это:

//Display the photo
BitmapImage PhotoBitmap = new BitmapImage();
PhotoBitmap.SetSource(e.ChosenPhoto);
Photo.Source = PhotoBitmap;

использует поток e.ChosenPhoto и может не перематывать положение потока.

Поэтому, когда вы делаете это:

Byte[] PhotoBytes = new byte[e.ChosenPhoto.Length];
e.ChosenPhoto.Read(PhotoBytes, 0, PhotoBytes.Length);

вы начинаете в конце потока, ничего не читая.

Используйте Seek для сброса Позиции потока.

0 голосов
/ 01 февраля 2012

Могу поспорить, что это то, что происходит (комментарии в строке):

//Display the photo
BitmapImage PhotoBitmap = new BitmapImage();
PhotoBitmap.SetSource(e.ChosenPhoto); // This is reading from the stream
Photo.Source = PhotoBitmap;

//Convert the photo to bytes
Byte[] PhotoBytes = new byte[e.ChosenPhoto.Length];
e.ChosenPhoto.Read(PhotoBytes, 0, PhotoBytes.Length); // Fails to read the full stream
                                                      // because you already read from it

//Convert the bytes back to a bitmap
BitmapImage RestoredBitmap = new BitmapImage();
MemoryStream stream = new MemoryStream(PhotoBytes); // You're creating a stream that
                                                    // doesn't contain the image
BitmapImage image = new BitmapImage();
RestoredBitmap.SetSource(stream); // Fails because your stream is incomplete

Seek до 0 в потоке, прежде чем пытаться читать с него. И проверьте возвращаемое значение из вызова Read, чтобы убедиться, что оно соответствует PhotoBytes.Length.

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