|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|