powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разложить BMP на пиксели ...
18 сообщений из 18, страница 1 из 1
Разложить BMP на пиксели ...
    #37051417
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго здравия.
Стоит задача разложить BMP файл на пиксели, т.е. произвести чтение файла и запись координат и цветов пикселя в DBF (построчно змейкой). Буду рад любым примерам и подсказкам заранее благодарен.
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051553
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>разложить BMP файл на пиксели
google "формат файла bmp"
>запись координат и цветов пикселя в DBF (построчно змейкой).
Что значит "построчно змейкой"?
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051820
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот нашел что то похожее, но надо именно из файла http://forum.foxclub.ru/read.php?32,177180,179682#msg-179682.
Построчно змейкой значит слева - направо следущая строчка справа - налево и т.д.
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051823
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще http://jenyay.net/Programming/Bmp теперь бы все это для фокса сделать
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051833
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scorp1978Вот еще http://jenyay.net/Programming/Bmp теперь бы все это для фокса сделать
И что там сложного? BMP состоит из 2-х частей: заголовка и "точек", структура заголовка по твоей ссылке описана, точки записываются твоей "змейкой" в зависимости от качества цвета по 1, 2 или 3 байта на точку.
Открываешь файл FOPEN(), читаешь и парсишь заголовок. Для облегчения преобразования 2-х и 4-х байтовых чисел в фоксе есть функция CTOBIN()
Начни с разбора заголовка, что не получится - спрашивай.
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051834
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить, там еще изврат есть: каждая строка добивается ненужными байтами чтобы длина строки была кратна 4 байтам.
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051837
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А структура таблицы задана или надо придумать самому?
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051847
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура любая например Поле_НомерСтроки Поле_Х Поле_Y Поле_Цвет Поле_ПризнакКонецСтроки
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051862
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Разложить BMP на пиксели ...
    #37051882
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему не читается файл
?FREAD(nFileHandle, 4)
пусто выводит хотя должен BM
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051960
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Разложить BMP на пиксели ...
    #37051963
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scorp1978почему не читается файл
?FREAD(nFileHandle, 4)
пусто выводит хотя должен BM
Фокс перезапусти. после FOPEN() надо обязательно закрывать FCLOSE()

Выше файл криво прикрепился, запаковал.
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051979
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропуск мусора неправильно написал, так надо
Код: plaintext
fread(lnFH,  4  - (lnWidth *  3 ) %  4 ) && Пропускаем мусор для выравнивания до  4 -х байт
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37051990
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал википедию , еще косяки нашел с порядком считывания.
В результате будут координаты такие: (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
Разложить BMP на пиксели ...
    #37052040
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, премного благодарен, и чтоб твоя широкая дорога не стала узкою тропой !!! :) буду разбираться если что напишу.
...
Рейтинг: 0 / 0
Разложить BMP на пиксели ...
    #37061219
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новую тему не завожу подскажите здесь. Есть БД с пикселями, подскажите самый простой способ вывести пиксель на форму в цвете????
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Разложить BMP на пиксели ...
    #39569336
Фотография neznajka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Разложить BMP на пиксели ...
    #39569337
Фотография neznajka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините - натолкнулся на более простое решение на Фоксклубе: сообщение от piva в конце темы .
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разложить BMP на пиксели ...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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