Конференция "Media" » Снимок части рабочего стола [D7]
 
  • Елена (14.06.16 13:36) [0]
    Здравствуйте.

    Помогите, пожалуйста, сделать снимок части рабочего стола.

    Я пользуюсь таким кодом:

     DC := GetDC( 0 );
     for i:=1 to 6 do
     begin
       for j:=1 to 12 do
       begin
         cz[i,j]:=GetPixel( DC, xz[j], yz[i] );
       end;
     end;
     ReleaseDC(0, DC);

    Здесь я получаю снимок всего рабочего стола, и заполняю двухмерный массив цветами пикселов с нужными мне координатами в нижней левой части экрана.
    Но дело в том, что делается снимок всего рабочего стола, а можно ли делать снимок заданной области рабочего стола (например нижний левый угол с координатами от 0,700 до 250,900).
    Возможно тогда будет программа работать быстрее? Так как эту процедуру вызываю по таймеру каждые 0,5сек. в течении 10минут без перерыва и бывают часто зависания программы.

    Спасибо.
  • megavoid © (14.06.16 14:44) [1]
    Копируйте с рабочего стола в TBitmap функцией Bitblt, а потом обращайтесь к битмапу попиксельно.

    bmp := TBitmap.Create;
    bmp.Height := 200;
    bmp.Width := 250;
    BitBlt(bmp.Canvas.Handle, 0, 0, 250, 200, DC, 0, 700, SRCCOPY);
    bmp.free;
  • Rouse_ © (14.06.16 15:06) [2]

    > Но дело в том, что делается снимок всего рабочего стола

    Вот прямо-таки делается? Вы не в ту степь смотрите.
    Здесь явно выраженная проблема X-Y-Z
  • Елена (14.06.16 15:16) [3]

    > Копируйте с рабочего стола в TBitmap функцией Bitblt, а
    > потом обращайтесь к битмапу попиксельно.
    > ?
    >

    А не будет ли это еще тяжелее в плане производительности (для процессора), чем мой вариант?
  • Rouse_ © (14.06.16 15:31) [4]

    > Елена   (14.06.16 15:16) [3]
    > А не будет ли это еще тяжелее в плане производительности
    > (для процессора), чем мой вариант?

    Сделать то чего хочешь?
    Снимок с экрана и по всей видимости много снимков за энн-ое количество времени. Так?
  • NoUser © (14.06.16 15:56) [5]
    > Вот прямо-таки делается?

    Ну да, написано: DC := GetDC( 0 ) и что ж это по-твоему как не 'снимок всего рабочего стола', если даже произвольные пиксели оттуда повыдёргивать можно ))
  • Rouse_ © (14.06.16 16:20) [6]

    > NoUser ©   (14.06.16 15:56) [5]
    > Ну да, написано: DC := GetDC( 0 ) и что ж это по-твоему
    > как не 'снимок всего рабочего стола'

    Понял, так и запишу в свой букварь. (оверлеи вычеркиваю :)
  • Eraser © (14.06.16 19:35) [7]

    > Елена   (14.06.16 15:16) [3]


    > А не будет ли это еще тяжелее в плане производительности
    > (для процессора), чем мой вариант?

    в плане производительности придумать что-то тяжелее вашего варианта сложно.
  • Д7 (16.11.16 17:50) [8]
    В вашем коде вообще не делается никаких снимков/скриншотов.
    Зато используется GetPixel(), которое до сих пор (во всяком случае до Win7 включительно) жутко тормознутое.

    Сделайте как вам посоветовали в [1], помимо скорости ещё и других массивов вам не понадобится, диб-секция и так массив (выравненный правда в основном).
 
Конференция "Media" » Снимок части рабочего стола [D7]
Есть новые Нет новых   [134427   +37][b:0][p:0]