| 
| 
 | Вопрос # 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™ (статус: Доктор наук), 18 ноября 2010, 12:11 [#3]: Цитата (Вадим К): а разве html хранит картинки? там только ссылки на картинки. Эту ссылку нужно извлечь, а потом отдельно скачать. Но то, что вы пишете, больше похоже на вложение в тексте письма.Приведите хотя бы структуру того, с чем Вы работаете.  Я тоже сомневался, что такое бывает, но ответил, исходя из предположения, что и такое возможно, "а мужики-то не знают" (© какая-то реклама).
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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™ (статус: Доктор наук), 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'ÿÙ' |  
|   | 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™ (статус: Доктор наук), 18 ноября 2010, 13:02 [#12]: Цитата (Рауф): В самом тексте HTML заканчивается U9KnNZtMf/2Q\x3d\x3d'). Подскажите, как найти конец строки?  Скорее всего, конечный символ строки - это символ, стоящий перед любым не-base64-символом.
 
   const
    Base64Code: string[64] =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 18 ноября 2010, 13:07 [#13]: Цитата (Вадим К): а разве html хранит картинки? там только ссылки на картинки. Эту ссылку нужно извлечь, а потом отдельно скачать. Но то, что вы пишете, больше похоже на вложение в тексте письма.Приведите хотя бы структуру того, с чем Вы работаете.  Слушай, действительно есть такая байда! Набрал в гугле запрос "картинки" и страницу с результатами сохранил на винт - всё так и есть! А мужики-то, и правда, не знают...
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 18 ноября 2010, 13:11 [#14]: Цитата (Рауф): Буду пробывать  Ща попробую написать тебе функцию, мне самому интересно стало. Да и скука тут, на работе.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 18 ноября 2010, 16:14 [#15]:Забубенил я тебе класс для поиска base64-закодированных картинок в HTML. Качай и радуйся. Надеюсь, свои 5 баллов я заслужил...
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |