![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
костярик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.7.2006 Репутация: нет Всего: нет |
Здравствуйте!
У меня вопрос. Я часто работаю с графикой, обычно использую класс TBitmap (ScanLine). Интересно, есть ли другой, более быстрый способ вывести изображение на экран, не используя АПИ-шки типа OpenGL или DirectX. |
|||
|
||||
Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: нет Всего: 7 |
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Этот метод позволяет получить прямой доступ к памяти битовой карты изображения, что может быть быстрее этого? Другое дело отображение на экран! -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
костярик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.7.2006 Репутация: нет Всего: нет |
В том-то и дело. Как вывести массив цветов на экран, наиболее быстрым образом? Это сообщение отредактировал(а) костярик - 21.7.2006, 05:13 |
|||
|
||||
Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 1 Всего: 54 |
BitBlt и FastBlt
-------------------- ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
PatBlt
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Kesh, функция FastBlt ни где не описана, если можно - ее параметры и название динамической библиотеки. (полностью ее прототип)
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 1 Всего: 54 |
Пардон, ошибся... не FastBlt, а MaskBlt
Добавлено @ 15:15 Хотя все-таки нет... Склероз пока еще не убил мой мозг...
Но работает он соответственно с DDSurface'ами... -------------------- ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
костярик, просил - это все таки directDraw, я понял что он хотел выводить при помощи GDI -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
костярик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.7.2006 Репутация: нет Всего: нет |
Правильно, надо вывести массив цветов при помощи GDI. Тут вот BitBlt посоветовали, он копирует из одного контекста в другой. А как загнать цвета в контекст? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
В него не нужно загонять просто
canvas.handle - это и есть контекст -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
костярик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.7.2006 Репутация: нет Всего: нет |
Да, но у меня есть только массив из троек байтов (R, G, B) для каждого цвета. У меня еще нет канвы. Как же мне имеющийся массив загнать в контекст. TBitmap я не использую, а то, понятно, можно было б через скан лайн. Есть ли такая возможность? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
CreateBitmapInderect - позволяет создать битмап в памяти, затем для него можно создать свой контекст. Он называется, что-то вроде контекста для памяти. Специальный контекст, не связанный ни с каким дескриптором окна. Это чистой воды Api операции. Я попробую поискать пример - когдато делал.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
А вот и пример нашел
LoadImage - Загружает картинку с диска getMem(BInfo, sizeOf(BITMAP)); - выделение памяти под структуру, которая будет использоваться для функции получения информации о битмапе - GetObject(bmp,sizeOf(BITMAP), BInfo); hBDC := CreateCompatibleDC(form1.Canvas.Handle); - создает новый контекст для структур в памяти (memory device context) т.е. для битовой маски совместимый с графическим адаптером. ипользуя в качестве образца контекст формы (подойдет любое окно). SelectObject(hBDC, bmp); - связывает дескриптор битмапа с полученным контекстом BitBlt(form1.Canvas.Handle, 0, 0, BInfo.bmWidth, BInfo.bmHeight, hBDC, 0, 0, SRCCOPY); - рисуем все что есть в контексте битмапа на контекст формы. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alexeis |
|
||||||||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
А теперь рассмотрим как можно создать битмап в памяти не загружая его с диска
В начале заполняем информационную структуру bmiInfo: BITMAPINFO;
Затем создаем собственно сам битмап
На этом этапе нам уже нужен контекст DC (как его получить писал выше) (lpBits : PRGBTriple;) - указатель на карту. Однако полученный битмап является DDB - Device Dependent Bitmap (не смотря на то что функция называется CreateDIBSection), что не позволяет нам н напрямую обращатся к битам карты. Поэтому мы должны его сконвертировать в DIB. Для этого заново готовим структуру bmiInfo
И получаем битмап в нужном нам формате DIB_RGB_COLORS
В параметре lpBits получаем - адрес первого байта заветной битовой карты куда можно записывать битовый масив с учетом выравнивания каждой строки битмапа на границу 4-х байт (как в файле bmp) И чтоб в этом убедится можно протестировать пикселы выводя вручную их из памяти на форму (это медленный вариант - только для тестирования ![]()
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||||||
|
|||||||||||
костярик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.7.2006 Репутация: нет Всего: нет |
Большое спасибо вам за инфу -- как раз то, что надо. Только у меня так и не получилось обратиться к массиву битов. Ваша конструкция p^[j,i].r работать, понятно, не будет: p -- это ж у нас указатель, к тому же нетипизированный, а не массив. Тут надо хитрее поступать. Я пытался работать с массивом цветов двумя способами: как с массивом байтов и как с массивом элементов, типа TRGBTriple. Для этого пришлось объявить новый тип:
TRGBTripleArray = array [1..10000] of TRGBTriple; PRGBTripleArray = ^TRGBTripleArray; Но это все равно не помогло. На экране ничего не рисуется, даже черный квадрат. Хотя bitblt возвращает true. Вот полностью весь код:
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Эта констукция не может не работать, я ее проверял, на конкретном примере, не работает что-то другое! Добавлено @ 11:25 Вот рабочий пример! Это сообщение отредактировал(а) alexeis1 - 24.7.2006, 11:30 Присоединённый файл ( Кол-во скачиваний: 35 ) ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
А вот вариант почти как вам надо!
Добавлено @ 11:53 Вот тут вообще без загрузки изображения + Вывод при помощи bitblt + Вывод попиксельно из памяти указанной в p из того же битмапа
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
welt |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 21.5.2005 Где: UnderGround Репутация: нет Всего: нет |
Alexeis,
Ну я немного поправлю. Все-таки нехорошо, когда для разных картинок надо каждый раз вручную задавать границы массива
Я доработал код таким образом:
|
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Главное, что ясна суть, так нагляднее видно что это матрица, а под свою задачу каждый пусть переделывает сам ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
поправил спустя почти 3 года
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |