Имя: Пароль:
IT
 
Странности с bmp
0 Rizhij_Nikitos
 
26.11.12
15:55
Собственно сел я разбирать 2 bmp файла, открыл один - там строки между собой разделены нулями, открыл второй - строки между собой ничем не разделены... Вопрос от чего это зависит?
1 Irek-kazan
 
26.11.12
15:59
а почитать? wiki:BMP
2 Rizhij_Nikitos
 
26.11.12
16:04
С этого и начал, все равно не догоняю в чем прикол. Кратность четырем байтам что ли?
3 Undefined vs NULL
 
26.11.12
16:05
(2) а почему нет?
4 Rizhij_Nikitos
 
26.11.12
16:12
Все, просек. Спасибо.
5 Irek-kazan
 
26.11.12
16:13
ну поделился бы хоть, вдруг кому пригодится
6 Rizhij_Nikitos
 
28.11.12
16:57
Делюсь ценной инфой, заодно еще вопрос в тему.
1)Когда мы сканим бмп изображение с 54 байта идет у нас уже сам рисунок. Расположен он снизу вверх слева направо, каждый пиксель описан BGR(не RGB) тремя значениями. В конце строки может стоять 0 00 000 или не стоять нулей. Зависит это от того сколько пикселей ширина.
Если ширина 100 пикселей(к примеру), тогда ширина в описании 300 байт по 3 байта на пиксель(BGR), делим на 4 - получается целое число
Если ширина 101 пиксель, тогда описание 303, делим на 4 - выходит до целого не хватает одного байта, который забивается нулем.
Соответственно далее по теме - ширина строки в описании, то есть КоличествоПикселей*3 должна быть кратна 4. То есть делиться на 4 без остатка, в противном случае до кратности все будет забито нулями.

2) Вот еще вопрос:
Данные отсюда http://c-site.h1.ru/infa/bmp_struct.htm
Смещение ДлинаПоля Описание
18    4    Ширина изображения в пикселях
22    4    Высота изображения в пикселях

Работало все хорошо, я получал массив данных из бип-шки:
   StreamTypeEnum = Новый Структура("adTypeBinary, adTypeText", 1, 2);
   ConnectModeEnum = Новый Структура(
       "adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
       |adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
       |adModeUnknown, adModeWrite", 1, 3, 4194304, 16, 4, 8, 12, 0, 2);
   SaveOptionsEnum = Новый Структура("adSaveCreateNotExist, adSaveCreateOverWrite", 1, 2);
   
   StreamIn = Новый COMОбъект("ADODB.Stream"); //Для создания этого объекта требуется MDAC 2.5 и выше
   StreamIn.Type = StreamTypeEnum.adTypeBinary;
   
   StreamIn.Open(); //По умолчанию открывается на чтение
   StreamIn.LoadFromFile(ПутьКФайлу); //Очевидно, что для больших файлов так поступать нехорошо.
   Data = StreamIn.Read(); //у переменной Data тип COMSafeArray, это массив байтов
   StreamIn.Close(); //Больше нам этот поток не нужен - закрываем.
   
   //Конечно, манипуляция в памяти приемлима только для небольших файлов!
   СодержимоеМассив=Новый Массив();
   СодержимоеМассив = Data.Выгрузить();

После чего брал СодержимоеМассив[18]-СодержимоеМассив[21], переводил каждое значение в 16ричную систему, склеивал в одно значение и переводил обратно в десятичную.
Однако теперь есть одна непонятка:
http://s019.radikal.ru/i621/1211/28/c8ccc5e92463.png
Это первые 54 бита массива изображения. Размер изображения 1280х800.

Внимание вопрос: каким образом из байтов с 18 по 21 и с 22 по 25 получить значения 1280 и 800???
7 drcrasher
 
28.11.12
17:00
предположу, что 18 + 19 * 256 + 20 * 256 * 256 + 21  * 256 * 256 * 256
ну или как-то так
8 Midaw
 
28.11.12
17:01
А чем не устраивает?

Картинка (Picture)
Преобразовать (Convert)
Синтаксис:

Преобразовать(<ФорматКартинки>)
Параметры:

<ФорматКартинки> (обязательный)

Тип: ФорматКартинки.
Определяет формат картинки.
Возвращаемое значение:

Тип: Картинка.

Описание:

Создает копию картинки и преобразовывает ее в заданный формат.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Примечание:

Преобразуются картинки растровых форматов в BMP и PNG форматы.
Картинки векторных форматов не преобразовываются.
Для многокадровых картинок (Icon и анимированный GIF) преобразуется первый кадр.
9 Rizhij_Nikitos
 
28.11.12
17:02
Я не преобразовываю картинку, я на ней рисую.
10 Midaw
 
28.11.12
17:04
(9) и все же

Картинка (Picture)
ПолучитьДвоичныеДанные (GetBinaryData)
Синтаксис:

ПолучитьДвоичныеДанные()
Возвращаемое значение:

Тип: ДвоичныеДанные.

Описание:

Преобразует картинку в тип ДвоичныеДанные.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
См. также:

Картинка, конструктор Формирование из двоичных данных
11 drcrasher
 
28.11.12
17:04
+7, 0+5*256+0+0 = 1280
32 + 3*256=800
12 Rizhij_Nikitos
 
28.11.12
17:05
(10) Попробуй - получишь первые... ну 100 может байт или что то в этом роде. Целиком массив с которым ты работать можешь ты не получишь - там будет стоять что то в духе "00 01 0D 50 FF FF FF.."
13 Midaw
 
28.11.12
17:06
(12) понятно, но я бы советовал с BMP работать на чем нибудь другом. с использованием какой нибудь библиотеки.
14 Rizhij_Nikitos
 
28.11.12
17:06
(11) да, я понял, спасибо. Я использую:
   РазмерПоГоризонталиХ=СменаСистемыСчисления(Значение21,"0123456789ABCDEF")+СменаСистемыСчисления(Значение20,"0123456789ABCDEF")+СменаСистемыСчисления(Значение199,"0123456789ABCDEF")+СменаСистемыСчисления(Значение18,"0123456789ABCDEF");
   РазмерПоВертикалиХ=СменаСистемыСчисления(Значение25,"0123456789ABCDEF")+СменаСистемыСчисления(Значение24,"0123456789ABCDEF")+СменаСистемыСчисления(Значение23,"0123456789ABCDEF")+СменаСистемыСчисления(Значение22,"0123456789ABCDEF");
   
   ШиринаИзображения=ПереводИз16СистемыВ10(РазмерПоГоризонталиХ);
   ВысотаИзображения=ПереводИз16СистемыВ10(РазмерПоВертикалиХ);


Функция ПереводИз16СистемыВ10(Число16)
   Сумма=0;
   Для Х=0 По СтрДлина(Число16)-1 Цикл
       Сумма=Сумма+ЧислоПоБукве(Сред(Число16,СтрДлина(Число16)-Х,1))*Pow(16,Х);        
   КонецЦикла;
   Возврат(Сумма);
КонецФункции


Функция СменаСистемыСчисления(Значение, Шаблон)
   Результат="";
   
   Основание = СтрДлина(Шаблон);
   Пока Значение>0 цикл
       Остат = Значение%Основание;
       Результат1=Сред(Шаблон,Остат+1,1);
       Значение = (Значение-Остат)/Основание;
       Результат = Результат1 + Результат;
   КонецЦикла;
   Если Результат="" Тогда
       Возврат "0"
   КонецЕсли;
   Возврат Результат;
КонецФункции


Функция ЧислоПоБукве(Буква)
   Если Буква="A" Тогда
       Возврат(10);    
   ИначеЕсли Буква="B" Тогда
       Возврат(11);    
   ИначеЕсли Буква="C" Тогда
       Возврат(12);    
   ИначеЕсли Буква="D" Тогда
       Возврат(13);    
   ИначеЕсли Буква="E" Тогда        
       Возврат(14);    
   ИначеЕсли Буква="F" Тогда        
       Возврат(15);
   Иначе
       Возврат(Число(Буква));
   КонецЕсли;    
КонецФункции
15 Rizhij_Nikitos
 
28.11.12
17:08
(13) то есть другую среду разработки?
16 drcrasher
 
28.11.12
17:08
(14) сложно то как =)
17 Rizhij_Nikitos
 
28.11.12
17:08
(16) ты хотел сказать красиво?
18 drcrasher
 
28.11.12
17:09
(15) есть ВК для работы с изображениями. Ну или через СОМ объекты.
Хотя тут всё зависит от целей.
19 drcrasher
 
28.11.12
17:09
(17) не всегда обосновано использование конвертеров.
20 Midaw
 
28.11.12
17:10
(15) просто производительность твоего кода будет в тысячу раз хуже, ибо гонять растр через интерпретатор это жестоко.
21 Rizhij_Nikitos
 
28.11.12
17:11
(18) да итак COM использую, где надо, а где можно без него и без него обхожусь.
(19) каких конвертеров
(20) разъясни.
22 Midaw
 
28.11.12
17:13
(21) попробую разъяснить, если скажешь что именно ты хочешь добиться
23 Rizhij_Nikitos
 
28.11.12
17:18
(22) на текущий момент код заливает изображение цветом построчно(ширина строки 1 пиксель). То есть я беру белый лист, ставлю на левой границе точки вдоль всей границы, ставлю другим цветом точки на правой границе, запускаю прогу, она редактирует рисунок и рисует линию от левой до правой границы, преобразуя один цвет в другой равномерно. Переход такой получается.
По сути это движок для работы с изображениями на 1С - в дальнейшем планирую разработать алгоритм сравнения изображений или их частей, а так же рисования одной картинки, с помощью использования большого количества других уменьшенных картинок.
24 Rizhij_Nikitos
 
28.11.12
17:23
Вот! Заработало!
Исходник:
http://i052.radikal.ru/1211/a2/1331322e32bc.jpg
Результат:
http://s019.radikal.ru/i605/1211/58/5eb82bdc919d.jpg
25 Midaw
 
28.11.12
17:27
(23) photoshop изобретаешь? ну тогда это точно не тот язык на котором обрабатывают картинки...
26 Rizhij_Nikitos
 
28.11.12
18:55
(25) в фотошопе нельзя по заданным алгоритмам рисовать картинки, либо я слишком плохо знаком с фотошопом, но 1с весьма удобный в обращении, это правда компенсируется не приспособленностью под такие задачи, но если очень хочется - то можно.
27 Midaw
 
29.11.12
09:33
Полезнее будет http://www.codenet.ru/pshop/8bf.php
28 dmpl
 
29.11.12
09:40
(26) Можно, есть плагин, позволяющий написать программу преобразования изображения - и в ней можно рисовать. А так - вам прямой путь к Лого.