Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разложить BMP на пиксели ... / 18 сообщений из 18, страница 1 из 1
10.01.2011, 19:14
    #37051417
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Всем доброго здравия.
Стоит задача разложить BMP файл на пиксели, т.е. произвести чтение файла и запись координат и цветов пикселя в DBF (построчно змейкой). Буду рад любым примерам и подсказкам заранее благодарен.
...
Рейтинг: 0 / 0
10.01.2011, 21:16
    #37051553
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
>разложить BMP файл на пиксели
google "формат файла bmp"
>запись координат и цветов пикселя в DBF (построчно змейкой).
Что значит "построчно змейкой"?
...
Рейтинг: 0 / 0
11.01.2011, 05:58
    #37051820
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Вот нашел что то похожее, но надо именно из файла http://forum.foxclub.ru/read.php?32,177180,179682#msg-179682.
Построчно змейкой значит слева - направо следущая строчка справа - налево и т.д.
...
Рейтинг: 0 / 0
11.01.2011, 06:05
    #37051823
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Вот еще http://jenyay.net/Programming/Bmp теперь бы все это для фокса сделать
...
Рейтинг: 0 / 0
11.01.2011, 06:41
    #37051833
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Scorp1978Вот еще http://jenyay.net/Programming/Bmp теперь бы все это для фокса сделать
И что там сложного? BMP состоит из 2-х частей: заголовка и "точек", структура заголовка по твоей ссылке описана, точки записываются твоей "змейкой" в зависимости от качества цвета по 1, 2 или 3 байта на точку.
Открываешь файл FOPEN(), читаешь и парсишь заголовок. Для облегчения преобразования 2-х и 4-х байтовых чисел в фоксе есть функция CTOBIN()
Начни с разбора заголовка, что не получится - спрашивай.
...
Рейтинг: 0 / 0
11.01.2011, 06:44
    #37051834
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Забыл добавить, там еще изврат есть: каждая строка добивается ненужными байтами чтобы длина строки была кратна 4 байтам.
...
Рейтинг: 0 / 0
11.01.2011, 06:49
    #37051837
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
А структура таблицы задана или надо придумать самому?
...
Рейтинг: 0 / 0
11.01.2011, 07:25
    #37051847
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Структура любая например Поле_НомерСтроки Поле_Х Поле_Y Поле_Цвет Поле_ПризнакКонецСтроки
...
Рейтинг: 0 / 0
11.01.2011, 08:13
    #37051862
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Dima T, я конечно понимаю что для тебя просто :), но для меня это пока не понятно хотелось бы по подробнее вот что я накидал для начала


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
nFileHandle = FOPEN("c:\proba.bmp")
nSize = FSEEK(nFileHandle,  0 ,  2 )
FSEEK(nFileHandle, смещаемся где находится начало массива координат)
FOR i= 0  TO размер массива координат
	Pos_X = FREAD(nFileHandle, чтение координаты  X)
	Pos_Y = FREAD(nFileHandle, чтение координаты  Y)
	Pos_Color = FREAD(nFileHandle,чтение цвета)
ENDFOR
...
Рейтинг: 0 / 0
11.01.2011, 08:40
    #37051882
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
почему не читается файл
?FREAD(nFileHandle, 4)
пусто выводит хотя должен BM
...
Рейтинг: 0 / 0
11.01.2011, 10:01
    #37051960
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Scorp1978Dima T, я конечно понимаю что для тебя просто :), но для меня это пока не понятно хотелось бы по подробнее вот что я накидал для начала
...
да уж ... ты похоже даже не понял что там в файле.
Файл последовательность байт:
Первый заголовок в котором указано где начинается сама картинка.
Второй заголовок N байт, в них указано размер картинки высота и ширина в пикселях, способ записи цвета и пр.

Вот упрощенный пример разбора BMP в труколоре (24-бит) т.е. 3 байта на одну точку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
lnFH = fopen('test.bmp')
if lnFH <=  0 
	? 'Файл не открылся'
	return
endif
lcHead = fread(lnFH,  14 ) && структура BITMAPFILEHEADER
if !left(lcHead,  2 ) == 'BM' && первые два байта всегда 'BM'
	? 'Это не BMP'
	return
endif

lnOffset = ctobin(substr(lcHead,  11 ,  4 ), '4RS') && Номер байта с которого начинается сама картинка
lcHead = fread(lnFH, lnOffset -  14 ) && Остальной заголовок
lnWidth = ctobin(substr(lcHead,  5 ,  4 ), '4RS')
lnHeight = ctobin(substr(lcHead,  9 ,  4 ), '4RS')
? 'Размер:', lnWidth, lnHeight
for y =  1  to lnHeight
	for x =  1  to lnWidth
		lnR = asc(fread(lnFH,  1 ))
		lnG = asc(fread(lnFH,  1 ))
		lnB = asc(fread(lnFH,  1 ))
		? "точка (", x, y, ") = RGB(", lnR, lnG, lnB, ")"
	endfor
	if (lnWidth *  3 ) %  4  !=  0 
		fread(lnFH, (lnWidth *  3 ) %  4 ) && Пропускаем мусор для выравнивания до  4 -х байт
	endif
endfor
fclose(lnFH)
...
Рейтинг: 0 / 0
11.01.2011, 10:04
    #37051963
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Scorp1978почему не читается файл
?FREAD(nFileHandle, 4)
пусто выводит хотя должен BM
Фокс перезапусти. после FOPEN() надо обязательно закрывать FCLOSE()

Выше файл криво прикрепился, запаковал.
...
Рейтинг: 0 / 0
11.01.2011, 10:18
    #37051979
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Пропуск мусора неправильно написал, так надо
Код: plaintext
fread(lnFH,  4  - (lnWidth *  3 ) %  4 ) && Пропускаем мусор для выравнивания до  4 -х байт
...
Рейтинг: 0 / 0
11.01.2011, 10:30
    #37051990
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Почитал википедию , еще косяки нашел с порядком считывания.
В результате будут координаты такие: (1,1) - левый верхний угол, (3,3) - правый нижний.
Вот окончательный вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
lnFH = fopen('test.bmp')
if lnFH <=  0 
	? 'Файл не открылся'
	return
endif
lcHead = fread(lnFH,  14 ) && структура BITMAPFILEHEADER
if !left(lcHead,  2 ) == 'BM' && первые два байта всегда 'BM'
	? 'Это не BMP'
	return
endif

lnOffset = ctobin(substr(lcHead,  11 ,  4 ), '4RS') && Номер байта с которого начинается сама картинка
lcHead = fread(lnFH, lnOffset -  14 ) && Остальной заголовок
lnWidth = ctobin(substr(lcHead,  5 ,  4 ), '4RS')
lnHeight = ctobin(substr(lcHead,  9 ,  4 ), '4RS')
? 'Размер:', lnWidth, lnHeight
for y = lnHeight to  1  step - 1  && Пикселы хранятся построчно, снизу вверх
	for x =  1  to lnWidth
		* цвета каждого пиксела хранятся в порядке BGR (Blue,Green,Red)
		lnB = asc(fread(lnFH,  1 ))
		lnG = asc(fread(lnFH,  1 ))
		lnR = asc(fread(lnFH,  1 ))
		? "точка (", x, y, ") = RGB(", lnR, lnG, lnB, ")"
	endfor
	if (lnWidth *  3 ) %  4  !=  0 
		fread(lnFH,  4  - (lnWidth *  3 ) %  4 ) && Пропускаем мусор для выравнивания до  4 -х байт
	endif
endfor
fclose(lnFH)
...
Рейтинг: 0 / 0
11.01.2011, 10:57
    #37052040
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Dima T, премного благодарен, и чтоб твоя широкая дорога не стала узкою тропой !!! :) буду разбираться если что напишу.
...
Рейтинг: 0 / 0
16.01.2011, 15:09
    #37061219
Scorp1978
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Новую тему не завожу подскажите здесь. Есть БД с пикселями, подскажите самый простой способ вывести пиксель на форму в цвете????
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
14.12.2017, 02:13
    #39569336
neznajka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Dima TПочитал википедию , еще косяки нашел с порядком считывания.
В результате будут координаты такие: (1,1) - левый верхний угол, (3,3) - правый нижний.
Вот окончательный вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
lnFH = fopen('test.bmp')
if lnFH <= 0
	? 'Файл не открылся'
	return
endif
lcHead = fread(lnFH, 14) && структура BITMAPFILEHEADER
if !left(lcHead, 2) == 'BM' && первые два байта всегда 'BM'
	? 'Это не BMP'
	return
endif

lnOffset = ctobin(substr(lcHead, 11, 4), '4RS') && Номер байта с которого начинается сама картинка
lcHead = fread(lnFH, lnOffset - 14) && Остальной заголовок
lnWidth = ctobin(substr(lcHead, 5, 4), '4RS')
lnHeight = ctobin(substr(lcHead, 9, 4), '4RS')
? 'Размер:', lnWidth, lnHeight
for y = lnHeight to 1 step -1 && Пикселы хранятся построчно, снизу вверх
	for x = 1 to lnWidth
		* цвета каждого пиксела хранятся в порядке BGR (Blue,Green,Red)
		lnB = asc(fread(lnFH, 1))
		lnG = asc(fread(lnFH, 1))
		lnR = asc(fread(lnFH, 1))
		? "точка (", x, y, ") = RGB(", lnR, lnG, lnB, ")"
	endfor
	if (lnWidth * 3) % 4 != 0
		fread(lnFH, 4 - (lnWidth * 3) % 4) && Пропускаем мусор для выравнивания до 4-х байт
	endif
endfor
fclose(lnFH)


Dima T, у меня огроменная просьба к Вам: подскажите, как правильно модифицировать эту Вашу программу, чтобы она прочитала не 24-битовый RGB-формат, а его гораздо более простую модификацию - "чисто-битовый" вариант градаций серого (его ещё называют факс-форматом), в котором каждый пиксель имеет глубину 1 бит и может быть только либо белым, либо чёрным. Для образца прилагаю такой bmp-шник - 32х32 пикселя, в центре которого изображён чёрный круг на белом фоне.
Я уже пробовал рассмотреть его и в HEX-режиме через FAR-менеджер - всё равно ничего не понятно: там пказывается всего 16 байтов, расположенных в 12 строках, что никак не перекликается со структурой 32х32 :(
Поэтому и непонятно, откуда начинать плясать. А мне нужно всего то программно проанализировать пиксели произвольной чёрной буквы на белом фоне (одной и той же фиксированной ширины W и высоты H для каждой буквы) и записать в dbf-ник на местах белых (фоновых) пикселей нули, а на местах чёрных - единицы.
Помогите, пожалуйста.
...
Рейтинг: 0 / 0
14.12.2017, 03:44
    #39569337
neznajka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить BMP на пиксели ...
Извините - натолкнулся на более простое решение на Фоксклубе: сообщение от piva в конце темы .
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разложить BMP на пиксели ... / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]