Не удается получить URL-адрес изображения с помощью jsoup

Я пытаюсь получить URL диапазона изображений, подобных этому:

for(Element img : document.select(".left-column .strillo-content .lazy img[src]")) {
    InputStream input = new java.net.URL(imageMainUrl).openStream();
    Bitmap bitmap = BitmapFactory.decodeStream(input);
    images.add(bitmap);
}

но каждый раз, когда я пытаюсь запустить свое приложение, я получаю это предупреждение:

java.net.MalformedURLException: Unknown protocol: data
at java.net.URL.<init>(URL.java:184)
at java.net.URL.<init>(URL.java:127)

поэтому я попытался напечатать URL-адрес, и я получил это:

data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

и я могу понять почему, потому что я на 100% уверен, что выбранный мной элемент является corrent, а также я делаю тот же процесс с другим разделом сайта, и он работает..

ОБНОВЛЕНИЕ 1: я попробовал этот метод для декодирования изображения "base64":

byte[] decodedString = Base64.decode(imageMainUrl, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

но результат тот же..

1 ответ

Решение

Это схема URI данных

http://en.wikipedia.org/wiki/Data_URI_scheme

Это позволяет добавлять встроенные данные в ваш URI.

  • Извлеките часть URI base64 и получите массив байтов с parseBase64BinaryБолее подробная информация здесь: http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html
  • Используйте этот массив для построения ByteArrayInputStream
  • Используй свой BitmapFactory расшифровать его в Bitmap

редактировать

Этот код работает, он дает изображение размером 1px*1px gif. я использовал org.apache.commons.codec.binary.Base64 от commons-codec

String uri = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
byte[] decodedString = Base64.decodeBase64(uri.substring(uri.indexOf("data:image/gif;base64,") + "data:image/gif;base64,".length()));
ByteArrayInputStream is = new ByteArrayInputStream(decodedString);
FileOutputStream os = new FileOutputStream(new File("/tmp/test.gif"));

byte[] buffer = new byte[1024];
int length;

// copy the file content in bytes 
while ((length = is.read(buffer)) > 0)
{
    os.write(buffer, 0, length);
}

is.close();
os.close();
Другие вопросы по тегам