Здається, що тут може бути нового? Чому, і головне, навіщо тут піднято це питання? Під час роботи над одним Delphi-проектом виникла необхідність виводити HTML-текст з зображенням без формування зовнішнього файлу - картинка повинна зберігатися в тілі документу.
Відразу хочеться банально написати щось типу такого:
То що можна запропонувати як альтернативу?
Спочатку виникла думка копати в сторону SVG, але в результаті формується файл xml, з яким також щось потрібно робити. Притому, наявні конвертори скалярної у векторну графіку не забезпечують достатньої якості картинки.
Другий варіант - брутальний, створити таблицю без рамок з коміркою розміром в 1px, заливаючи її в потрібний колір:
Без довгих роздумів пишемо код на FireMonkey:
Завантажити весь проект.
В результаті можна отримати щось аналогічне:
Відразу маса недоліків:
І от якось мандруючи шляхами Інтернету, наткнувся на ще один метод - передача будь-якої інформації через url. Дані кодуються в base64 і не повинні перевищувати 32768 байтів. Можна написати свій конвертор або скористатися існуючим. В результаті отримуємо робочий стиль, який придатний для використання для картинки розміром 32х32 точки:
Використання в коді HTML:
Однозначні переваги:
До мінусів слід віднести лише невеликий максимальний розмір зображення в 32 КБайти.
Стаття написана у співпраці з Юрою Степанцем, який своєю рукою і гострим зором спрямовував мене в потрібне русло.
Відразу хочеться банально написати щось типу такого:
<img alt="name" height="32" src="image.jpg" width="32" />
То що можна запропонувати як альтернативу?
Спочатку виникла думка копати в сторону SVG, але в результаті формується файл xml, з яким також щось потрібно робити. Притому, наявні конвертори скалярної у векторну графіку не забезпечують достатньої якості картинки.
Другий варіант - брутальний, створити таблицю без рамок з коміркою розміром в 1px, заливаючи її в потрібний колір:
. | . | . |
. | . | . |
. | . | . |
Без довгих роздумів пишемо код на FireMonkey:
function TImageToHtml_fm_Main.ColorToHtml(aColor: TAlphaColor): string; begin if (TAlphaColorRec(aColor).R = 0) and (TAlphaColorRec(aColor).G = 0) and (TAlphaColorRec(aColor).B = 0) then Result := Format('#%.2x%.2x%.2x', [TAlphaColorRec(ComboColorBox1.Color).R, TAlphaColorRec(ComboColorBox1.Color).G, TAlphaColorRec(ComboColorBox1.Color).B]) else Result := Format('#%.2x%.2x%.2x', [TAlphaColorRec(aColor).R, TAlphaColorRec(aColor).G, TAlphaColorRec(aColor).B]); end; procedure TImageToHtml_fm_Main.ImageControl1Change(Sender: TObject); const C_STYLE = '<style> td{' + 'height:1px;' + 'width:1px;' + 'border-style:none;' + 'padding:0px;' + '}' + '</style>'; C_TABLE = '<table cellspacing="0" cellpadding="0" cols="%d">'; var loBitMapData : TBitmapData; loCurrColor : TAlphaColor; sCurrColor : string; sText : string; x : Integer; y : Integer; begin Memo1.Lines.Clear; if ImageControl1.Bitmap.Map(TMapAccess.maRead, loBitMapData) then begin sText := C_STYLE + sLineBreak + '<div>' + Format(C_TABLE, [Trunc(ImageControl1.Bitmap.Width)]) + sLineBreak; for y := 0 to Trunc(ImageControl1.Bitmap.Height) - 1 do begin sText := sText + '<tr>'; for x := 0 to Trunc(ImageControl1.Bitmap.Width) - 1 do begin loCurrColor := loBitMapData.GetPixel(x, y); sCurrColor := ColorToHtml(loCurrColor); sText := sText + '<td bgcolor="' + sCurrColor + '"></td>' end; sText := sText + '</tr>' + sLineBreak; end; sText := sText + '</table></div>'; ImageControl1.Bitmap.Unmap(loBitMapData); end; Memo1.Lines.Text := sText; end;
Завантажити весь проект.
В результаті можна отримати щось аналогічне:
Відразу маса недоліків:
- відсутня прозорість;
- великий розмір, що зростає пропорційно розмірам вихідного зображення:
- неможливість використовувати картинку в стилях.
Хоча є і сумнівний плюс - її неможливо скопіювати або зберегти на диск.
І от якось мандруючи шляхами Інтернету, наткнувся на ще один метод - передача будь-якої інформації через url. Дані кодуються в base64 і не повинні перевищувати 32768 байтів. Можна написати свій конвертор або скористатися існуючим. В результаті отримуємо робочий стиль, який придатний для використання для картинки розміром 32х32 точки:
div.my_name{width:32px;height:32px;border:none;background-image:url(data:image/png;base64, зображення_в_кодуванні_base64);}
Використання в коді HTML:
<div class="my_name">Зображення виглядає тепер значно краще, миліше нашим очам:
Однозначні переваги:
- використання стилів, що дає можливість використання зображення необмежену кількість разів без суттєвого збільшення коду;
- коректне відображення прозорості;
До мінусів слід віднести лише невеликий максимальний розмір зображення в 32 КБайти.
Стаття написана у співпраці з Юрою Степанцем, який своєю рукою і гострим зором спрямовував мене в потрібне русло.
Немає коментарів :
Дописати коментар