2012-06-15 2 views
1

Я создаю приложение, которое отображает множество изображений, созданных из PDF-файлов Imagemagick. Некоторые изображения не могут быть загружены с помощью BitmapFactory. Он просто возвращает null istead растрового изображения.Невозможно загрузить JPEG-изображение с помощью BitmapFactory.decodeFile. Возвращает null

Журнал говорит:

D/skia(15101): --- decoder->decode returned false 

Это не проблема памяти, как некоторые из изображений с проблемой очень мало, и образы не повреждены, потому что я могу показать их на любой другой машине , Кроме того, BitmapFactory может декодировать ширину и высоту, если я использую

inJustDecodeBounds = true; 

в вариантах.

Я пытался загрузить одно из изображений с помощью внешнего средства просмотра изображений (QuickPic) без везения. Он также возвращает «Ошибка загрузки», что указывает на то, что SKIA считает, что изображение повреждено или по крайней мере не поддерживается по какой-либо причине.

Одно из изображений, которые не работают, можно найти here

Полный код я использую, чтобы загрузить его здесь

BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(FILENAME,o); 
    int width = o.outWidth; 
    int height = o.outHeight; 
    /* Width and height decoded successfuly */ 

    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = false; 
    Bitmap bitmap = BitmapFactory.decodeFile(FILENAME,o2); 
    /*Bitmap is null */ 

Любая идея, что не так и как это можно обойти это Добро пожаловать.

+0

может у опубликовать код создания FILENAME? – dor506

+0

FILENAME - это просто константа, ссылающаяся на конкретный файл изображения. В моем случае он определяется как «конечная статическая строка FILENAME =« /sdcard/MPSIT.jpg »; – Niels

ответ

1

Видимо SKIA has a problem с JPG с профилем CMYK. Обходной путь для моей проблемы состоял в том, чтобы добавить параметр «-colorspace RGB» к моему преобразованию imagemagick.

1

Изображения с цветовым пространством CMYK, например this, не могут быть декодированы Android по умолчанию, чтобы они не отображались.

Niels был прав, но если вы не можете изменить этот параметр при преобразовании imageMagick, вы можете преобразовать изображение CMYK в изображение RGB (поддерживаемое Android). Существует библиотека imageMagick для Android под названием android-lib-magick, а here - обходной путь к этой проблеме.

Просто импортировать this library код до преобразования его цветового довольно прост:

ImageInfo info = new ImageInfo(path); // path where the CMYK image is your device 
MagickImage imageCMYK = new MagickImage(info); 
imageCMYK.transformRgbImage(ColorspaceType.CMYKColorspace); 
Bitmap bitmap = MagickBitmap.ToBitmap(imageCMYK); 

Если изображение не в устройстве или на SD-карту, вам нужно будет загрузить его первым.

Я реализовал два простых метода, используя android-lib-magick под названием «getCMYKImageFromPath» и «getCMYKImageFromURL». Вы можете увидеть код here:

https://github.com/Mariovc/GetCMYKImage

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