![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 26.08.2013
Сообщений: 187
|
![]()
Всем привет, опять при изучении delphi запнулся, на коварной функции BitMap'а - ScanLine, хотелось бы чтобы кто нибудь пояснил следующие строчки кода:
Код:
1)Перебираем все Y по переданному объекту Bitmap 2)В массив байтов, при это X[N]:=8 мы получаем все коды X по Y. 3)Начинаем перебирать каждый X 4)Здесь творится что-то не понятное 5)Тут тоже Взято из книги Библия делфи, Фленов очень мало чего написал по этому поводу, я непонимаю почему мы умножаем на 3, видимому потому что картинка pixelformat:=24bit, а X:=8, почему после этого мы прибавляем ещё и +1,+2: Код:
Это как я понял есть: У RGB если все три цвета ранвы то это будет градация серого. Но почему именно так? Кто может, и кому не сложно, разжуйте пожалуйста ![]() пысы загрузка картинки: Код:
Код:
Последний раз редактировалось Winexcel; 13.12.2013 в 14:57. |
![]() |
![]() |
![]() |
#2 | |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]() Цитата:
У Флёнова не рассмотрен обычный метод работы со сканлайном, как делает большинство (ибо так гораздо понятнее), а именно через ^(array[0..N] of TRGBTriple), у него сделано через обычные нетипизированные указатели - var p0: PByteArray; Чтобы работать с битмапом, надо знать , что для 24битного битмапа данные идут подряд так: 1я строка пикселей по байту на компонент - ргбргбргбргбргб и т.д. в количестве: ширина картинки - пикселей и ширина *3 в байтах, потом новая строка пикселей (сразу подряд) и так пока все строки не закончатся (высота битмапа). Обычно берут цикл , в нём берут сканлайн первой строки, и получают указатель на начало этой строки байт. Если указатель взять типизированный, то можно в следующем цикле по пикселям обращаться к Trgbtriple и её компонентам без заморочек. Но тут сделано проще - для внутреннего цикла текущий пиксель вычисляется каждый раз со смещением на 3 байта, через умножение, давая и начало пикселя и байт под красный цвет, а через добавление 1 и 2 осуществляется доступ к зелёной и синей компонентам пикселя. Грейскейл картинки при этом делается странным алгоритмом - синий и зелёный приравниваются красному. Возможно, оно и даёт определённый результат, но общепринятая формула http://ru.wikipedia.org/wiki/Оттенки_серого т.е. надо прочитать все 3 компонента пикселя, вычислить по формуле значение и его присвоить всем компонентам пикселя. Вот мой пример работы со сканлайном http://programmersforum.ru/showpost....&postcount=628 обсуждение касательно этого примера в той теме выше. Последний раз редактировалось phomm; 14.12.2013 в 08:25. |
|
![]() |
![]() |
![]() |
#3 | ||
Форумчанин
Регистрация: 26.08.2013
Сообщений: 187
|
![]()
Ура, нашлось время на продолжение обучения, решил сделать эксперимент:
Код:
Код:
Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
![]() (точнее 16) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 26.08.2013
Сообщений: 187
|
![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
вы забыли что размер пикселей у вас не один байт?
вы же считаете что пиксель это байт. потому и предпочитают работать через RGBTriple и тп. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 26.08.2013
Сообщений: 187
|
![]() Цитата:
0*3+1 - G 0*3+2 - B (или же наоборот BGR). С форматом pf32bit аналогично, очень рад что спустя столько времени понял ![]() Теперь ещё хотелось бы уточнить: почему используется именно RGB? И можем ли мы использовать такие цветовые модели как: CMYK, HSB? |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
JPEG градация серого | BARNEY | Мультимедиа в Delphi | 2 | 24.02.2016 22:11 |
ScanLine | ijonhson | C++ Builder | 1 | 28.03.2013 06:31 |
Работа со ScanLine | ofx | C++ Builder | 1 | 22.08.2012 20:36 |
работа с градиентом серого | frosti | Общие вопросы C/C++ | 1 | 24.04.2012 19:59 |
Оттенки серого | yulia | Мультимедиа в Delphi | 4 | 02.12.2008 15:50 |