Android: альтернативный загрузчик GIF? - PullRequest
2 голосов
/ 26 октября 2011

Я хочу загрузить изображения в Android, но если изображение слишком велико, я хочу изменить его размер до до загрузки.Я узнал, что можно использовать BitmapFactory, чтобы получить только размер изображения, затем можно выяснить соответствующий коэффициент масштабирования и использовать BitmapFactory, чтобы загрузить изображение с требуемыми размерами (согласно очень компетентным советам, которые я нашел в этомсвязанная тема ).

Так что я попробовал это, и он отказался работать.Я провел последний час, просматривая код, пытаясь выяснить, почему такая простая операция не имела никакого эффекта (коэффициент масштабирования был полностью проигнорирован!)

Затем я наткнулся на проблему с Android3072 ... оказывается, это было определено как поврежденное для файлов GIF в течение более двух лет.Я понимаю, что GIF не совсем современный, но он все еще там и широко используется (в моем тестовом наборе их много, поэтому он казался разбитым равномерно, пока я не нашел этот отчет об ошибке).

Мой вопрос заключается в том, что я могу использовать в качестве альтернативы BitmapFactory, которая будет правильно читать и изменять размер файла GIF при использовании коэффициента масштабирования, не игнорируя его автоматически? Ограничения памяти не позволяют загружать большие изображения напрямую для дальнейшей обработки, поэтомуможет потребоваться потоковое решение.

Мой другой вопрос: сколько других сталкиваются со старыми, нефиксированными ошибками, подобными этой, и либо не осознают это, либо хуже, полагаются на API для точного выполнения запрошенной функциии в конечном итоге с утечками памяти и другими странными сюрпризами?

1 Ответ

2 голосов
/ 29 марта 2013

В итоге я воспользовался решением, опубликованным здесь .

options.inSampleSize = 2;
bitmap = BitmapFactory.decodeStream(new URL(url).openStream(),null, options);
Bitmap scaledBitmap = scaleDown(bitmap, 1280, true);
bitmap = scaledBitmap;

Где scaleDown:

public static Bitmap scaleDown(Bitmap realImage, float maxImageSize,
                               boolean filter) {
    float ratio = Math.min(
                (float) maxImageSize / realImage.getWidth(),
                (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
                height, filter);
    return newBitmap;
}
...