Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 747

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Как сохранить картинку из текста HTML, заданную в формате data:image/jpg;base64 в файл или в поток

Рауф Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Рауф (статус: Посетитель)
Вопрос отправлен: 18 ноября 2010, 11:34
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Берём картинку из HTML в виде закодированного Base64-текста, суём этот текст в какой-нить string-буфер. Далее, берём функцию DecodeBase64() вот отсюда и получаем на выходе декодированные данные, которые потом сохраняем на диск в файл.jpg с помощью TFileStream или пишем в память с помощью TMemoryStream.
Ещё рекомендую посмотреть вот это.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 ноября 2010, 11:51
Оценка за ответ: 5

Комментарий к оценке: Большое спасибо - то что надо!

Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 20 ноября 2010, 14:36; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 18 ноября 2010, 11:53 [#1]:

а разве html хранит картинки? там только ссылки на картинки. Эту ссылку нужно извлечь, а потом отдельно скачать.
Но то, что вы пишете, больше похоже на вложение в тексте письма.Приведите хотя бы структуру того, с чем Вы работаете.
Галочка "подтверждения прочтения" - вселенское зло.
Рауф

Рауф (статус: Посетитель), 18 ноября 2010, 12:05 [#2]:

Сайт Google.ru
Поиск картинок
Пример куска исходного текста из результатов поиска:
'data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSERUUExMWFBUWGB8aGRcYFxkWGx...
Как я понял картинка хранится в самом HTML файле. Зашифрована по base64. При проходе по Images объекта Document TWebBrowser я получаю кусок приведенный выше. Что с ним делать дальше для сохранения картинки - вот в чем вопрос?
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 12:11 [#3]:

Цитата (Вадим К):

а разве html хранит картинки? там только ссылки на картинки. Эту ссылку нужно извлечь, а потом отдельно скачать. Но то, что вы пишете, больше похоже на вложение в тексте письма.Приведите хотя бы структуру того, с чем Вы работаете.

Я тоже сомневался, что такое бывает, но ответил, исходя из предположения, что и такое возможно, "а мужики-то не знают" (© какая-то реклама).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 12:12 [#4]:

Цитата (Рауф):

Что с ним делать дальше для сохранения картинки - вот в чем вопрос?

А мой ответ не подошёл? Почему?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Рауф

Рауф (статус: Посетитель), 18 ноября 2010, 12:12 [#5]:

Я попробывал следующее
msStream := TMemoryStream.Create;
stImageScr := Copy(stImageScr,
Pos('data:image/jpg;base64,',
stImageScr) +
Length('data:image/jpg;base64,'),
Length(stImageScr));
stImageScr := Copy(stImageScr,
Pos(')</', stImageScr) - 2, Length(stImageScr));
stImageScr := fnBase64Decode(stImageScr);
msStream.Write(PChar(stImageScr)^, Length(stImageScr));
msStream.Position := 0;
bpPic.LoadFromStream(msStream);
msStream.Free
Ошибка при LoadFromStream. В качестве bpPic использую TBitMapPlus - нормально работает с Jpeg файлами, проверил. Я плохо знаю HTML. Нужна ли мне часть строки /9j/4AAQSkZJRgABAQAAAQABAAD/ - одинакова дя всех файлов jpeg хранящихся в HTML и где закончить строку для преобразования.
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 12:15 [#6]:

Ты посмотри под отладчиком, чему равны первые 3 символа раскодированного буфера. Для JPEG они должны быть 'яШя' (FF D8 FF).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Рауф

Рауф (статус: Посетитель), 18 ноября 2010, 12:34 [#7]:

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

Рауф (статус: Посетитель), 18 ноября 2010, 12:38 [#8]:

Посмотрел яШя, а чем должно заканчиваться и критично ли это?У меня заканчиваетя #$12'&#143;&#255;&#217;'
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 12:43 [#9]:

Ты сохрани на диск из браузера ту саму картинку в файл - получишь и размер файла и содержимое, которое потом можно посмотреть в HEX-редакторе и сравнить с содержимым твоего TMemoryStream, которое тоже можно сохранить на винт. Пляши от этого, экспериментируй. Истина где-то рядом (© X-files).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Рауф

Рауф (статус: Посетитель), 18 ноября 2010, 12:45 [#10]:

В самом тексте HTML заканчивается U9KnNZtMf/2Q\x3d\x3d')</script>. Подскажите, как найти конец строки?
Рауф

Рауф (статус: Посетитель), 18 ноября 2010, 12:47 [#11]:

Буду пробывать
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 13:02 [#12]:

Цитата (Рауф):

В самом тексте HTML заканчивается U9KnNZtMf/2Q\x3d\x3d'). Подскажите, как найти конец строки?

Скорее всего, конечный символ строки - это символ, стоящий перед любым не-base64-символом.
  const
    Base64Code: string[64] =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 13:07 [#13]:

Цитата (Вадим К):

а разве html хранит картинки? там только ссылки на картинки. Эту ссылку нужно извлечь, а потом отдельно скачать. Но то, что вы пишете, больше похоже на вложение в тексте письма.Приведите хотя бы структуру того, с чем Вы работаете.

Слушай, действительно есть такая байда! Набрал в гугле запрос "картинки" и страницу с результатами сохранил на винт - всё так и есть! А мужики-то, и правда, не знают...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 13:11 [#14]:

Цитата (Рауф):

Буду пробывать

Ща попробую написать тебе функцию, мне самому интересно стало. Да и скука тут, на работе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 16:14 [#15]:

Забубенил я тебе класс для поиска base64-закодированных картинок в HTML. Качай и радуйся.
Надеюсь, свои 5 баллов я заслужил...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 20 ноября 2010, 14:36 [#16]:

внезапно, спецификация http://tools.ietf.org/html/rfc2397
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.02 сек.