![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| CynicRus |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: 2 Всего: 5 |
Приветствую уважаемых форумчан. Имеется массив пикселов в формате TRGBTriple,
нужно это дело быстро отрисовать на канве. Пробую это сделать с помощью
пробую это сделать следующим образом:
И собственно получаю чёрный экран вместо изображения в указанной области-) Собственно вопрос - как вывести картинку из массива указанного типа в Canvas при помощи SetDIBitsToDevice? UPD: изменил biBitCount на 24, но получаю какое-то кривое изображение вместо требуемого-( Тоесть оно геометрически верное, а вот цвета какие-то не те-) Это сообщение отредактировал(а) CynicRus - 9.4.2014, 09:43 |
||||||
|
|||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Причин может быть много, всегда нужно начинать со значения, которое возвращает функция. Но некоторые странности видны сразу.
Почему biHeight := -Height; ? В битмапах высота может быть отрицательной, если строки идут в обратном порядке, но не факт, что эта функция переваривает такие. Я бы задал для начала положительную. Почему biBitCount := 8; при том что TRGBTriple указывает на 24х битный формат цвета? Но в любом случае начинаем дебаг с возвращаемых значений. Нужно знать, то ли функция не выполнилась, то ли выполнилась при том что рассматривала входные данные иначе чем предполагалось . Это сообщение отредактировал(а) Alexeis - 9.4.2014, 09:51 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CynicRus |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: 2 Всего: 5 |
Фух. Вот с таким онанизмом у меня получилось вывести пиксели как надо:
где ToBMP:
Но, помоему - это напрочь не оптимальный вариант быстрого вывода на экран-)) Как бы теперь выпилить это самое лишнее преобразование в битмап с выдиранием его пикселей? |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Непонятно для чего тут GetDIBits . Достаточно иметь объект класса TBitmap в нужных размерах. Я так понимаю, что он выступает в роли бэк буфера для рисования.
Расскажу по секрету, что если взять Bmp.ScanLine[Bmp.heigth - 1], то это и будет указатель на начало диб секции TBitmap. Соответственно выпиливаем из кода вообще все, кроме. SetDIBitsToDevice(Canvas.Handle, X, Y, Width, Height, 0, 0, 0, Height, Bmp.ScanLine[Bmp.heigth - 1], bi^, DIB_RGB_COLORS); Важно обратить внимание чтобы Width, Height совпадали с Bmp.heigth и Bmp.Width, а лучше вообще именно их передавать в SetDIBitsToDevice. Очевидно, что всю инициализацию следует убрать из функции рендера. В ней должен остаться только один вызов SetDIBitsToDevice и больше ничего. Разве что можно добавить еще ValidateRect чтобы винда узнала, о том, что область больше не нуждается в перерисовке и WM_PAINT больше не нужно слать. Это сообщение отредактировал(а) Alexeis - 9.4.2014, 11:16 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CynicRus |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: 2 Всего: 5 |
Спасибо! Только я попробовал с SetDIBitsToDevice(Canvas.Handle, X, Y, Width, Height, 0, 0, 0, Height,
Bmp.ScanLine[Bmp.heigth - 1], bi^, DIB_RGB_COLORS); - и ничего, белый экран. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Нужно убедиться, что размеры битмапа совпадают с размерами передаваемыми как Width, Height и то что на битмапе что-то нарисовано. Если битмап создается пустой, то он изначально залит белым цветом. Может это как раз и говорит, что все правильно рисуется.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CynicRus |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: 2 Всего: 5 |
SetDIBitsToDevice(Canvas.Handle, X, Y, Width, Height, 0, 0, 0, Height, Bmp.ScanLine[Bmp.heigth - 1], bi^, DIB_RGB_COLORS); - разобрался я с этим, спасибо большое! Единственное, по непонятной причине - цвета...Точнее не цвета, а тона на отображаемом становятся темнее, чем на оригинале. При этом - при сохранении просто в файл - всё ок. Хм, странно - но выставив DIB_PAL_COLORS последним параметром, я получил нормальный цвета-) Это сообщение отредактировал(а) CynicRus - 11.4.2014, 10:30 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |