Xamarin Android. Преобразование массива байтов в растровое изображение. Декодер Skia возвращает false

Я получаю следующую ошибку при попытке преобразовать некоторые изображения, хранящиеся в базе данных SQLite, в виде большого двоичного объекта в растровое изображение.

[skia] --- decoder->decode returned false

Я пытаюсь использовать следующий код:

// Loads a Bitmap from a byte array
public static Bitmap bytesToBitmap (byte[] imageBytes)
{
    Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);

    return bitmap;
}

Результат: некоторые изображения успешно трансформируются, но для других декодирование Skia возвращает false. Всегда отображаются одни и те же изображения, и одни и те же другие получают ошибку.

Та же база данных используется в приложении для iOS, и все изображения отображаются правильно. Изображения в формате jpeg.

Я нашел похожие проблемы, решенные здесь, но я не смог перевести его на С#.

Кто-нибудь знает обходной путь для загрузки растровых изображений из байтовых массивов без таких проблем?


person PPCC    schedule 05.05.2014    source источник


Ответы (1)


Наконец-то заработало!!!

Мне пришлось сделать обходной путь следующим образом:

/// Loads a Bitmap from a byte array

public static Bitmap bytesToUIImage (byte[] bytes)
{
    if (bytes == null)
        return null;

    Bitmap bitmap;


    var documentsFolder = Environment.GetFolderPath (Environment.SpecialFolder.Personal);

    //Create a folder for the images if not exists
    System.IO.Directory.CreateDirectory(System.IO.Path.Combine (documentsFolder, "images"));

    string imatge = System.IO.Path.Combine (documents, "images", "image.jpg");


    System.IO.File.WriteAllBytes(imatge, bytes.Concat(new Byte[]{(byte)0xD9}).ToArray());

    bitmap = BitmapFactory.DecodeFile(imatge);

    return bitmap;
}

Обратите внимание, что в созданном файле отсутствовал конечный байт файла .jpeg «D9», поэтому мне пришлось добавить его вручную. Я точно знаю, что в мои изображения был включен этот байт, и я также пытался сгенерировать растровое изображение, добавив «D9» в byteArray с помощью BitmapFactory.DecodeByteArray, но это не сработало.

Итак, единственный работающий для меня обходной путь — это создание файла из byteArray и декодирование этого файла. Надеюсь, это может помочь кому-то в будущем.

person PPCC    schedule 23.05.2014