Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Алгоритмы
Перезагрузить страницу Алгоритм перевода описания картинки в формат base64
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 18.05.2008, 15:51

Вступление
==========
Есть картинка, красного цвета, в формате "bmp", шириной 1 пиксель и высотой 1 пикселей. Чтобы Вы получили представление об этой картинке изображу эту картинку в виде буквы:

К

или её можно записать, условно так:

FF0000

В base64 она будет выглядеть так:

Qk06AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABgAAAAAAAQAAA AAAAAAAAAAAAAAAAAAAAAAAAD/
AA==



Цветная картинка, красного цвета, шириной 2 пикселя и высотой 1 пиксель. В виде букв:

КК

или её можно записать, условно так:

FF0000 FF0000

В base64 она будет выглядеть так:

Qk0+AAAAAAAAADYAAAAoAAAAAgAAAAEAAAABABgAAAAAAAgAAA AAAAAAAAAAAAAAAAAAAAAAAAD/
AAD/AAA=



Цветная картинка, красного цвета, шириной 3 пикселя и высотой 1 пиксель. В виде букв:

ККК

или её можно записать, условно так:

FF0000 FF0000 FF0000

В base64 она будет выглядеть так:

Qk1CAAAAAAAAADYAAAAoAAAAAwAAAAEAAAABABgAAAAAAAwAAA AAAAAAAAAAAAAAAAAAAAAAAAD/
AAD/AAD/AAAA



Вопрос
======
Есть цветная картинка, в формате "bmp", шириной (например)3 пикселя и высотой (например) 2 пикселя. Чтобы Вы получили представление об этой картинке изображу эту картинку в виде букв:

КЖЗ
КЖЗ

Здесь одна буква, как бы показывает один пиксель, а её название цвет этого пикселя (К-красный, Ж-Жёлтый , З-Зелёный).

или её можно записать, условно так:

FF0000 FFFF00 00FF00
FF0000 FFFF00 00FF00

Здесь FF0000 означает один пиксель красного цвета,
FFFF00 означает один пиксель жёлтого цвета, и т.д. две строки означают 2 пикселя по высоте.

Подскажите, пожалуйста, по какому алгоритму можно из записи:

FF0000 FFFF00 00FF00
FF0000 FFFF00 00FF00

получить (вручную) запись этой картинки в base64:

Qk1OAAAAAAAAADYAAAAoAAAAAwAAAAIAAAABABgAAAAAABgAAA AAAAAAAAAAAAAAAAAAAAAAAAD/
AP//AP8AAAAAAAD/AP//AP8AAAAA


(формат "bmp", не принципиален, если для какого то другого формата это сделать легче, то можно и в другом)
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,270
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 19.05.2008, 00:47

Начнем с того, что запись base64 не соответствует "условной" картинке. Формат BMP имеет еще и заголовок. Всего там закодировано вот что:
Цитата:
0000000000: 42 4D 4E 00 00 00 00 00 │ 00 00 36 00 00 00 28 00
0000000010: 00 00 03 00 00 00 02 00 │ 00 00 01 00 18 00 00 00
0000000020: 00 00 18 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
0000000030: 00 00 00 00 00 00 00 00 │ FF 00 FF FF 00 FF 00 00
0000000040: 00 00 00 00 FF 00 FF FF │ 00 FF 00 00 00 00
А кодировка выполняется тривиально просто: три октета (байта, символа) переразбиваются на 4 группы по 6 бит, которые рассматриваются как числа:
Цитата:
42 4D 4E -> 0100 0010 0100 1101 0100 1110 -> 010000 100100 110101 001110 -> 16 36 53 14
Полученные числа используются как индексы в строке «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw xyz0123456789+/»
Цитата:
16 36 53 14 -> Qk1O
Далее идет перекодировка 3->4, пока не кончатся символы.

Подробнее, например, в википедии
Ответить с цитированием
  (#3 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 19.05.2008, 08:59

Спасибо, за ответ. Накачал информацию о base64 и формате "bmp". На неделе попробую разобраться с Вашими рекомендациями, в субботу оставлю сообщение.
Ответить с цитированием
  (#4 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 24.05.2008, 12:09

Описание перехода к base64 очень подробное и понятное, спасибо.
Не понятно как картинку в виде:

КЖЗ
КЖЗ

или в виде:

FF0000 FFFF00 00FF00
FF0000 FFFF00 00FF00

превратить в вид:

42 4D 4E 00 00 00 00 00 ¦ 00 00 36 00 00 00 28 00
00 00 03 00 00 00 02 00 ¦ 00 00 01 00 18 00 00 00
00 00 18 00 00 00 00 00 ¦ 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 ¦ FF 00 FF FF 00 FF 00 00
00 00 00 00 FF 00 FF FF ¦ 00 FF 00 00 00 00
Ответить с цитированием
  (#5 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,270
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 25.05.2008, 01:37

Подробное описание формата BMP
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 25.05.2008, 16:57

Потихоньку разбираюсь, хитрость была в том, что цвет:
AA BB CC
в bmp записывается так:
СС BB AA

Во всех описаниях bmp используется что то вроде:
. . .
DWORD biSize;
LONG biWidth;
LONG biHeight;
. . .
Чтобы увидеть эти слова нужен какой то особый редактор?
Я их скачал целую кучу, но они дают только:
42 4D 4E 00 00 00 00 00 ¦ 00 00 36 00 00 00 28 00
00 00 03 00 00 00 02 00 ¦ 00 00 01 00 18 00 00 00
Ответить с цитированием
  (#7 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 25.05.2008, 16:59

Существуют ли описания bmp в виде HEX:
42 4D 4E 00 00 00 00 00 ¦ 00 00 36 00 00 00 28 00
00 00 03 00 00 00 02 00 ¦ 00 00 01 00 18 00 00 00
Ответить с цитированием
  (#8 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 26.05.2008, 01:29

Цитата:
Во всех описаниях bmp используется что то вроде:
. . .
DWORD biSize;
LONG biWidth;
LONG biHeight;
Эти слова - стрктура С++ и их в файле насамом деле нет.

Слова
DWORD biSize;
означают, что сначала идёт двойное слово (4 байта), которое они называют biSize (вероятно какой-то размер),
потом идёт
LONG biWidth; - сколько-то байтов (не помню сколько LONG занимает) занимает шиина,
а дальше высота.
Ответить с цитированием
  (#9 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,270
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 26.05.2008, 01:44

Цитата:
хитрость была в том, что цвет:
AA BB CC
в bmp записывается так:
СС BB AA
Это не совсем так. Просто на PC принят формат хранения чисел, при котором многобайтовые числа хранятся, начиная с младших байтов.
В результате слитное число AABBCC по байтам уже в памяти будет записано "наоборот": CC BB AA

Цитата:
Во всех описаниях bmp используется что то вроде:
. . .
DWORD biSize;
LONG biWidth;
LONG biHeight;
. . .
Чтобы увидеть эти слова нужен какой то особый редактор?
Я их скачал целую кучу, но они дают только:
42 4D 4E 00 00 00 00 00 ¦ 00 00 36 00 00 00 28 00
00 00 03 00 00 00 02 00 ¦ 00 00 01 00 18 00 00 00
При определенном навыке можно увидеть все эти слова уже в этой записи, просто отсчитывая нужное число байт:
Код:
42 4D                  bfType
4E 00 00 00 = 0000004E bfSize
00 00       = 0000     bfReserved1
00 00       = 0000     bfReserved2
36 00 00 00 = 00000036 bfOffBits

28 00 00 00 = 00000028 biSize
03 00 00 00 = 00000003 biWidth
02 00 00 00 = 00000002 biHeight
Ответить с цитированием
  (#10 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 31.05.2008, 18:53

Я стал писать картинки так: Из первого сообщения от Alexiski (18.5.2008, 23:47) из кода HEX, беру первые 54 байта, в них меняю только ширину (байт № 19) и высоту (байт № 23) на нужные мне, к ним добавляю пиксели в таком виде: FF0000. При этом строки в картинках переворачиваю к верх ногами (верхняя строка становится нижней) и цвета вида AA BB CC записываю так: СС BB AA. Каждая строка изображения дополняется нулями до длины, кратной четырем байтам.
Таким способом, картинка шириной 3 пикселя и высотой 1 пиксель, из красного жёлтого и зелёного пикселя (К Ж З) получается такой:
42 4D 4E 00 00 00 00 00 | 00 00 36 00 00 00 28 00
00 00 03 00 00 00 01 00 | 00 00 01 00 18 00 00 00
00 00 18 00 00 00 00 00 | 00 00 00 00 00 00 00 00
00 00 00 00 00 00*00 00 | FF 00 FF FF 00 FF 00 00
00 00
(звёздочкой условно указано окончание заголовка)

Строка изображения имела вид:
0000FF 00FFFF 00FF00
или:
00 00 FF 00 FF FF 00 FF 00
это составляет девять байтов, значит, для кратности четырём нужно дописать ещё три байта из нулей:
00 00 00
получим:
00 00 FF 00 FF FF 00 FF 00 00 00 00
или:
.. .. .. .. .. ..*00 00 | FF 00 FF FF 00 FF 00 00
00 00

Если нарисовать такую картинку в "Paint" и сохранить, то её код HEX будет таким:
42 4D 42 00 00 00 00 00 | 00 00 36 00 00 00 28 00
00 00 03 00 00 00 01 00 | 00 00 01 00 18 00 00 00
00 00 0C 00 00 00 00 00 | 00 00 00 00 00 00 00 00
00 00 00 00 00 00*00 00 | FF 00 FF FF 00 FF 00 00
00 00 00
то есть, почему то на один байт ("00") длиннее.

Если написать картинку шириной 1 пиксель и высотой 3 пикселя, из красного жёлтого и зелёного пикселя:
К
Ж
З
или так:
FF0000
FFFF00
00FF00
то будут уже три строки изображения:
00FF00
00FFFF
0000FF
или так:
00 FF 00
00 FF FF
00 00 FF
Каждая строка изображения содержит по три байта, значит к каждой надо добавить ещё по одному:
00 FF 00 00
00 FF FF 00
00 00 FF 00
получаем:
00 FF 00 00 00 FF FF 00 00 00 FF 00
или:
.. .. .. .. .. ..*00 FF | 00 00 00 FF FF 00 00 00
FF 00
окончательно:
42 4D 42 00 00 00 00 00 | 00 00 36 00 00 00 28 00
00 00 01 00 00 00 03 00 | 00 00 01 00 18 00 00 00
00 00 0C 00 00 00 00 00 | 00 00 00 00 00 00 00 00
00 00 00 00 00 00*00 FF | 00 00 00 FF FF 00 00 00
FF 00

эта же картинка, нарисованная в "Paint" дает такие коды:

42 4D 42 00 00 00 00 00 | 00 00 36 00 00 00 28 00
00 00 01 00 00 00 03 00 | 00 00 01 00 18 00 00 00
00 00 0C 00 00 00 00 00 | 00 00 00 00 00 00 00 00
00 00 00 00 00 00*00 FF | 00 00 00 FF FF 00 00 00
FF 00 00

то есть, опять на один байт ("00") длиннее.

Правильно ли я разобрался с форматом BMP, если да, то откуда лишний байт?
Ответить с цитированием
  (#11 (permalink)) Старый
andriano andriano вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 13.02.2006
По умолчанию 06.06.2008, 08:57

1. Если уж берешь готовый заголовок, то при изменении размеров корректировать нужно не только длину и ширину, но и размер битмапа (т.е. всего 3 величины).
2. Почему твой Paint дает картинку длиной 67 байт, не знаю - у меня 66.
3. Ты рассматриваешь единственный вариант формата BMP. Не знаю, понадобится ли это тебе, но все равно следует знать, что существуют и другие.
Ответить с цитированием
  (#12 (permalink)) Старый
Ю_рий Ю_рий вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2008
По умолчанию 07.06.2008, 14:48

O других форматах знаю, выбрал самый подходящий, На будущее хочу ознакомится с 32 разрядным "прозрачным", если знаете где хорошее описание подскажите.

Размер битмапа, как я понял особой роли не имеет, пока картинка не нарвётся на какую ни будь экзотичную программу.

Лишний байт, это может и сбой в моём компе, но тогда остаётся вопрос: правильно ли я понял формат BMP (24 разрядный)
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
andriano andriano вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 13.02.2006
По умолчанию 22.06.2008, 19:44

"Прозрачного" формата BMP не существует. Более того, в файлы 32-разрядный цвет также не записывается. Но если сформировать 32-разрядный буфер в памяти, то Винды вполне будут с ним работать, игнорируя каждый 4-й байт, т.к. не знают, для чего он нужен.
Кроме 24-разрядного формата в файлах используются форматы с палитрой и 8, 4, 2 или 1 разрядом на пиксел.

Размер битмапа вообще-то - одна из ОБЯЗАТЕЛЬНЫХ частей заголовка. Если какие-то конкретные программы не анализируют эту часть заголовка, это исключительно их личное дело. Как говорится, программ без ошибок не бывает. Но это совсем не означает, что ошибки в программы надо вносить искусственно.

А чего там понимать? Там и так все предельно ясно.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
без описания shen87 Любые вопросы от новичков 0 14.03.2012 07:12
Как составить алгоритм в виде описания и блок-схемы Sadam163 Алгоритмы 0 17.06.2011 14:27
Программы для анализа описания переменных в Pascale или С++ ABBA@12 Вопросы начинающих программистов 0 28.04.2010 00:07
Запись описания внешних методов в SDIMain.cpp VertiVertu C++ Builder 1 10.11.2008 09:15
Декодирование файла формата Base64 lsd DHTML, JavaScript, VBScript 1 16.05.2008 11:35
Что значит var pSN_INIT без описания типа ZonD Delphi 1 26.04.2008 23:47
Где находится функция описания события Romeros Visual C++ 3 20.07.2007 13:38
Создание описания теста в Borland C++ Flaffik Вопросы начинающих программистов 3 11.03.2007 21:14
Алгоритм искажения картинки TmK79 Алгоритмы 0 24.05.2006 15:24
Алгоритм Бута ускоренный алгоритм умножения чисел MrPIT Алгоритмы 0 20.05.2006 18:12
Код программы на Visual Prolog Алгоритм Флойда и Алгоритм Дейкстры r Вопросы начинающих программистов 2 08.12.2005 00:34
Описания стандартных функций d2e8k С/С++ 1 30.09.2005 19:19



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов