Может ли BitmapFactory.decodeFile обрабатывать файлы .ICO (значки Windows)? - PullRequest
0 голосов
/ 22 апреля 2010

Я работаю на Android. Попытка отобразить «favicon» (он же «ярлык») или веб-страницы.

Итак, у меня уже есть код для получения URL-адреса этого значка с любого веб-сайта и загрузки его на мой Android.

Теперь я пытаюсь сделать из него растровое изображение, но в результате всегда получаю нулевое значение.

Код:

String src = String.format("file:///data/data/com.intuitiveui.android/files/%s",prefName);
// prefName is "facebook.ico", and I do see tht file in my DDMS file browser. It's
// a valid icon file.

Bitmap res = BitmapFactory.decodeFile(src);
// This returns null

1010 * ТИА *

Ответы [ 5 ]

4 голосов
/ 22 апреля 2010

Вот список поддерживаемых форматов мультимедиа Android .ICO не среди них.Возможно, вы сможете найти декодер ICO на основе Java.

2 голосов
/ 22 апреля 2011

Библиотека SKIA предоставляет класс декодера для файла ICO. Мне удалось отобразить файл ICO в эмуляторе. Пока еще не пробовал в реальном устройстве Android.

Bitmap bmap = BitmapFactory.decodeFile("/sdcard/vlc.ico");

1 голос
/ 03 апреля 2011

У меня была похожая проблема.BitmapFactory.decode декодировал * .ico на эмуляторе, но не на моем Galaxy S. Решение для меня было:

                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                int read=0;
                while((read = inputStream.read()) != -1){
                     bos.write(read);
                }

                byte[] ba = bos.toByteArray(); 
                Bitmap icon = BitmapFactory.decodeByteArray(ba, 0, ba.length);//new FlushedInputStream(inputStream));
1 голос
/ 22 апреля 2010

Компонент WebView имеет метод getFavicon() , поэтому определенно возможно декодировать файлы ICO в Android. Вы можете взглянуть на источник Android , чтобы увидеть, как анализируются файлы ICO. Я быстро посмотрел, но не могу найти нужную часть.

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

Для чего стоит вот мой тестовый код, снова отмечая, что это не работает :

    String url = "http://stackoverflow.com";
    WebView wv = new WebView(this);
    wv.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            Log.i("HelloAndroid","Loaded " + url);              
            Log.i("HelloAndroid","Icon " + (view.getFavicon() == null ? "not" : "") + " found");
        }

    });
    WebIconDatabase wid = WebIconDatabase.getInstance();
    wid.requestIconForPageUrl(url, new WebIconDatabase.IconListener() {
        public void onReceivedIcon(String url, Bitmap icon) {
            Log.i("HelloAndroid","Found Icon for " + url);
        }
    });
    wv.loadUrl("http://stackoverflow.com");
    Log.i("HelloAndroid","Loading " + url);

Возможно, проблема в том, что я не добавляю WebView к видимому View. Если ты получишь это на работу, мне будет интересно услышать, что ты сделал.

Извините, что дал два полных ответа, но я подумал, что стоит опубликовать то, что я нашел.

0 голосов
/ 09 января 2017

Ответа не принято, сейчас я поделюсь своими выводами здесь.

Формат файла Windows .ico немного сложен, он может содержать одно или несколько небольших изображений с различными размерами и глубиной цвета, так что ониможет масштабироваться соответствующим образом.См. ICO_ (file_format)

Таким образом, при использовании команды unix "file" для проверки типа файла значка вы можете получить следующий результат:

  • a.ico : ресурс значков MS Windows - 1 значок, 32x32
  • b.ico : ресурс значков MS Windows - 9 иконок, 256x256

Примечание a.ico и b.ico содержит различное количество значков.

Я пытался использовать BitmapFactory.decodeFile для декодирования этих значков.

  • Два устройства Android с Android 4.3 могут декодировать только a.ico , но не могут декодировать b.ico .
  • Устройствас Android 4.4 или более поздней может декодировать как a.ico и b.ico .

Поскольку у меня только ограниченные устройства Android, я не могу датьлюбой вывод.Может быть, кто-то еще мог бы помочь.

Так что, если вы действительно хотите декодировать файлы .ico, вы можете попробовать:

  • Создать файлы .ico только с одним изображением / изображением
  • Напишите свой собственный .ico декодер или 3-ю библиотеку, например image4j
...