Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];

Вниз

BitBlt работает медленно при захвате с одним качеством и...   Найти похожие ветки 

 
DenisSM   (2003-10-31 11:44) [0]

День добрый всем.

Необоходимо захватить содержимое экрана и преобразовать его в 24-битовый bmp. BitBlt работает медленно если color quality не соответствует 24 битам. Что можно предпринять?

Заранее благодарен за ответ (кидайте и почтой).

Док.


 
ZEE   (2003-10-31 12:35) [1]

ИМХО: BitBlt работает не медленно - медленно преобразование проходит...
зы: я попробовал - на 16бит BitBlt "фотографирует" экран мгновенно (как для меня), разве что можт это "мгновенно" - не подходит, а надо еще быстрее :)

BitBlt(Canvas.Handle, 0,0,Screen.Width,Screen.Height,ScreenDC, 0, 0, SRCCOPY );


 
DenisSM   (2003-10-31 12:47) [2]

Абсолютная правда, но дело именно в том, что мы захватываем 16-24-32 битный экран, а получить должны 24-битный, так как именно он является стандартом (это долгая история). Захват действительно "мгновенен" - у меня порядка 0.009 сек получается с записью на диск в png формате при разрешении 1600X1200 с 24 битами. Но при конвертации в 24 это занимает 1.5 секунды!!!

Это схематически выгдяжит так:

HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
HGDIOBJ old;
int w = GetDeviceCaps(hdcScreen, HORZRES);
int h = GetDeviceCaps(hdcScreen, VERTRES);
HDC hdcDest = CreateBMP( w, h, 24, old);
BITMAP bmp;
BitBlt(hdcDest, 0, 0, w, h, hdcScreen, 0,0, SRCCOPY);

Назначение CreateBMP, полагаю, ясно - 24 битовая с размерами w,h.

Причина мне также понятна (надеюсь она верна :-) ). Важно осознать, как это "побороть". Вот тут я и прошу совета.


 
ZEE   (2003-10-31 14:08) [3]

как вариант - можно проверить скока времени будет тратится на фотографирование+преобразование если не создавать битмап каждый раз, а создать его где-то, в криэйте например - потом его поюзать и убить где-то в дестрое...
не уверен, что так быстрее, но все может быть...


 
DenisSM   (2003-10-31 14:20) [4]

не - это не вариант. Очевидно, что преобразование - причина задержки. Тут я уже веду обсуждение по поводу двойной буфферизации. Вот кусок диалога, но как это воплотить правильно, я не в курсе. %-(
-----------
У тебя происходит прямое преобразование изображения при чтении его из контекста экрана в контекст в памяти. Вот тут-то скорее всего и проблема. Дело в том, что если карточка такой режим не поддерживает (а поддерживают его не многие карточки), то обработка идёт програмно, а если ещё и карточка стоит на медленной шине, то тут совсем медленно всё работает.
Я бы попробовал двойную буферизацию. Сначала захватывать изображение в совместимый с дисплеем контекст в памяти (это должно работать очень быстро), а затем преобразовать картинку в другой контекст в памяти. Тут все должно работать гораздо быстрее. Хотя памяти требуется больше.
-----------


 
miek   (2003-10-31 20:34) [5]

Захватывать картинку быстрым способом, а потом конвертировать своей собственной процедурой.


 
CMPXCHG8   (2003-11-01 00:09) [6]

2miek ;-) верно
2DenisSM 1. почему стобственно 24? при 32 - быстрее доступ, каждый пиксель выровнен на границу DWORD - при больших массивах данных это даже очень корошо, хотя жрет больше памяти

Попробуй так:
---
HDC hdcDest = CreateCompatibleDC(0);
// один к одному - лучше, потому как при преобразованиях winь постоянно читает видеопамять а она не кэшируется
HBitmap hBbmp = CreateCompatibleBitmap(hdcDest,w,h);

SelectObject(hdcDest,hBmp);
bitBlt(hdcDest, 0, 0, w, h, hdcScreen, 0,0, SRCCOPY);
----
а далее - конвертируй в обычной памяти как угодно, можешь через тот же bitBlt, можешь свою процедуру написать что лучше, так как winевский blitter использует масочное умножение:
Mask.Red, Mask.Green, Mask. Blue
RGB:= RGB((Color and Mask.Red)* 255 / Mask.Red),
(Color and Mask.Green)* 255 / Mask.Green),
(Color and Mask.Blue)* 255 / Mask.Blue))
представь так над каждым пикселем? - медленно
а если задействовать MMX или SSE - раза в 2 быстрее минимум получится


 
Romaa   (2003-11-01 10:19) [7]

CMPXCHG8 © (01.11.03 00:09) [6]
Пример можна ??...


 
cmpxchg8   (2003-11-02 11:54) [8]

2all чтож, ребята придется маленькую статью про SSE и Дельфи накропать, уж совсем наболело, а если совсем не терпиться - смотрите JEDI lib


 
miek   (2003-11-03 20:14) [9]

WinAPI-шный блиттер, насколько я знаю, почти никогда не использует такой ужасный способ. Когда он работает над DIB, то вообще попикселная обрпботка не применяется, только блочная.



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
3-12279
Nimnull
2004-02-06 17:42
2004.03.05
DBGrid


1-12331
Siu
2004-02-22 20:04
2004.03.05
StringGrid


3-12235
Alexei Sviridov
2004-02-10 00:25
2004.03.05
Sql запрос


4-12587
alex_***
2003-12-30 15:18
2004.03.05
из hdc получить HWND его окна


3-12269
td
2004-02-06 21:57
2004.03.05
индексы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский