|
Странности с 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) Можно, есть плагин, позволяющий написать программу преобразования изображения - и в ней можно рисовать. А так - вам прямой путь к Лого.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |