Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] снятие скриншотов(для отправки по сети), помогите определиться с тактикой 
:(
    Опции темы
Alexeis
Дата 2.1.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата(DelphiFun @  2.1.2007,  00:53 Найти цитируемый пост)
Мы отправляем ведь только изменённые куски.. 

Хм. А как их найти эти самые измененные куски? Вычли из предыдущего кадра новый, вот и получили черные поля. Черное поле это цвет со значением "0" т.е. неизменные поля. РЛЕ такие области кодирует 
1) Признак повторения
2) Цвет повторения
3) Число пикселей повторения.

Поскольку в памяти битовая карта непрерывная и разбиение на строки идет внизу сверх, а в строках пикселы слева направо, то можно вообще игнорировать конец строки если на новой стоке продолжается тотже цвет. 

Как видно алгоритм основан, на простом сравнении и потому черезвычайно быстрый. Хотя для скриншотов наилучшее сжатие обычно дает png, но время сжатия одного кадра столь велико, что думаю даже Dual Core 6700 не потянет больше 5 кадров / с.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DelphiFun
Дата 2.1.2007, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



а.. спасибо за объяснение - понял.
Хорошее решение, мне представлялось более геморным.
PM MAIL   Вверх
DelphiFun
Дата 2.1.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Хм, а что-то xor'ом не получается выделить разницу.. Пробую так:
Код
var
  BMP1, BMP2, BMP3 : TBitmap;
  RowBMP1, RowBMP2, RowBMP3 : pByteArray;
  j, i : integer;

begin

  BMP1 := TBitmap.Create;
  BMP1.Width := Screen.Width;
  BMP1.Height := Screen.Height;
  BMP1.PixelFormat := pf24bit;
  BMP.LoadFromFile( 'ScreenShot1.bmp' );

  BMP2 := TBitmap.Create;
  BMP2.Width := BMP1.Width;
  BMP2.Height := BMP1.Height;
  BMP2.PixelFormat := pf24bit;
  BMP2.LoadFromFile( 'ScreenShot2.bmp' );

  BMP3 := TBitmap.Create;
  BMP3.Width := BMP1.Width;
  BMP3.Height := BMP1.Height;
  BMP3.PixelFormat := pf24bit;

  for j := 0 to BMP1.Height - 1 do begin

    RowBMP1 := pByteArray ( BMP1.ScanLine[j] );
    RowBMP2 := pByteArray ( BMP2.ScanLine[j] );
    RowBMP3 := pByteArray ( BMP3.ScanLine[j] );

    for i := 0 to BMP1.Width * 3 - 1 do
      if ( RowBMP2[i] = RowBMP1[i] ) then RowBMP3[i] := 0
      else RowBMP3[i] := RowBMP2[i];
//      RowBMP3[i] := RowBMP1[i] xor RowBMP2[i];

  end;

  BMP3.SaveToFile ( 'Diffrence.bmp' );

  ReleaseDC ( 0, DC );
  BMP1.Free; BMP2.Free; BMP3.Free;

end;


В чём тут может быть проблема?
PM MAIL   Вверх
Alexeis
Дата 2.1.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата(DelphiFun @  2.1.2007,  17:36 Найти цитируемый пост)
Хм, а что-то xor'ом не получается выделить разницу..

А зачем XOR ? Чем плох обычный минус? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DelphiFun
Дата 3.1.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Так нет, ни xor, ни минус не срабатывают!
А у тебя разве сработало?

А xor я попробовал по совету skyboy несколькими постами ранее здесь.
PM MAIL   Вверх
Alexeis
Дата 3.1.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Убрал все ненужное и подправил одну строчку
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  BMP1, BMP2, BMP3 : TBitmap;
  RowBMP1, RowBMP2, RowBMP3 : pByteArray;
  j, i : integer;
begin
  BMP1 := TBitmap.Create;
  BMP1.PixelFormat := pf24bit;
//***********************************************
//вот тут было BMP.LoadFromFile( 'ScreenShot1.bmp' );
  BMP1.LoadFromFile( 'ScreenShot1.bmp' );
//***********************************************
  BMP2 := TBitmap.Create;
  BMP2.PixelFormat := pf24bit;
  BMP2.LoadFromFile( 'ScreenShot2.bmp' );

  BMP3 := TBitmap.Create;
  BMP3.Width := BMP1.Width;
  BMP3.Height := BMP1.Height;
  BMP3.PixelFormat := pf24bit;

  for j := 0 to BMP1.Height - 1
  do
    begin
      RowBMP1 := pByteArray ( BMP1.ScanLine[j] );
      RowBMP2 := pByteArray ( BMP2.ScanLine[j] );
      RowBMP3 := pByteArray ( BMP3.ScanLine[j] );
      for i := 0 to BMP1.Width * 3 - 1
      do
        if ( RowBMP2[i] = RowBMP1[i] )
        then
          RowBMP3[i] := 0
        else
          RowBMP3[i] := RowBMP2[i];
  //      RowBMP3[i] := RowBMP1[i] xor RowBMP2[i];
    end;

  BMP3.SaveToFile ( 'Diffrence.bmp' );
  BMP1.Free;
  BMP2.Free;
  BMP3.Free;
end;


В прикрепленном архиве 3 файла 1) исходный, 2) измененный 3) разница

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  24.7z 108,27 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 3.1.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Кстати можно было сделать все намного лучше и быстрее при помощи функции 
Код

BOOL BitBlt(

    HDC hdcDest,    // handle to destination device context 
    int nXDest,    // x-coordinate of destination rectangle's upper-left corner
    int nYDest,    // y-coordinate of destination rectangle's upper-left corner
    int nWidth,    // width of destination rectangle 
    int nHeight,    // height of destination rectangle 
    HDC hdcSrc,    // handle to source device context 
    int nXSrc,    // x-coordinate of source rectangle's upper-left corner  
    int nYSrc,    // y-coordinate of source rectangle's upper-left corner
    DWORD dwRop    // raster operation code 
   );


Вот последний параметр как раз и определяет растровую операцию 

Цитата

BLACKNESS    Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.)
DSTINVERT    Inverts the destination rectangle.
MERGECOPY    Merges the colors of the source rectangle with the specified pattern by using the Boolean AND operator.
MERGEPAINT    Merges the colors of the inverted source rectangle with the colors of the destination rectangle by using the Boolean OR operator.
NOTSRCCOPY    Copies the inverted source rectangle to the destination.
NOTSRCERASE    Combines the colors of the source and destination rectangles by using the Boolean OR operator and then inverts the resultant color.
PATCOPY    Copies the specified pattern into the destination bitmap.
PATINVERT    Combines the colors of the specified pattern with the colors of the destination rectangle by using the Boolean XOR operator.
PATPAINT    Combines the colors of the pattern with the colors of the inverted source rectangle by using the Boolean OR operator. The result of this operation is combined with the colors of the destination rectangle by using the Boolean OR operator.
SRCAND    Combines the colors of the source and destination rectangles by using the Boolean AND operator.
SRCCOPY    Copies the source rectangle directly to the destination rectangle.
SRCERASE    Combines the inverted colors of the destination rectangle with the colors of the source rectangle by using the Boolean AND operator.
SRCINVERT    Combines the colors of the source and destination rectangles by using the Boolean XOR operator.
SRCPAINT    Combines the colors of the source and destination rectangles by using the Boolean OR operator.
WHITENESS    Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.)


Полный спектр всех операций, которые только могут понадобиться smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DelphiFun
Дата 3.1.2007, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Во чёрт, ошибся в еденичке!! smile
Спасибо за помощь!!

Хм, а почему с этими файлами аналогично не работает?
http://ifolder.ru/774066

Файлы 24битовые, что в них не так..?

Кстати, а код:
Код

RowBMP3[i] := RowBMP1[i] xor RowBMP2[i];

тоже весьма интересно работает, только немножечко не доходит до результата...
PM MAIL   Вверх
DelphiFun
Дата 3.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



На настоящих скриншотах опробовал - работает.. 
удивительно..
Рисовал в Microsoft Paint, что же в них может быть такого, что прога не выводит корректный результат?
PM MAIL   Вверх
DelphiFun
Дата 4.1.2007, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



хм.. с одними файлами работает с другими нет, не понятно что тут может стать причиной..
К алгоритму вроде придраться нельзя, так в чём же ошибка моя??
PM MAIL   Вверх
Alexeis
Дата 4.1.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



DelphiFun, Сорри 2 дня был полный дисконект  smile Так что там за файлы? Прикрепил бы, а то ведь я не могу даже проверить...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DelphiFun
Дата 4.1.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Вот эти файлы и файл-разницы..


С наступившим!!

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  2.zip 15,59 Kb
PM MAIL   Вверх
Alexeis
Дата 4.1.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата(DelphiFun @  4.1.2007,  18:49 Найти цитируемый пост)
Вот эти файлы и файл-разницы..

Там все нормально, только результат будет зависеть от порядка следования картинок. Если использовать XOR то в этом случае все однозначно. Результирующая картинка является правильной. Кстати я настоятельно советую воспользоваться bitblt, поскольку она использует аппаратное ускорение видеокарты и скорость такой операции будет гораздо больше чем при использовании процессора.

Добавлено @ 21:51 
Вот пожалуйста насколько проще и главное быстрее, можно сделать тотже самый XOR
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  BMP1, BMP2 : TBitmap;

begin
  BMP1 := TBitmap.Create;
  BMP2 := TBitmap.Create;
  BMP1.LoadFromFile( 'ScreenShot1.bmp' );
  BMP2.LoadFromFile( 'ScreenShot2.bmp' );
  BitBlt(BMP2.Canvas.Handle, 0, 0, BMP2.Width, BMP2.Height,
         BMP1.Canvas.Handle, 0, 0, SRCINVERT);
  BMP2.SaveToFile ( 'Diffrence.bmp' );
  BMP1.Free;
  BMP2.Free;
end;




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DelphiFun
Дата 4.1.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Спасибо большое за ответ!

А почему же получается такой результат??
Но XOR ведь тоже не отделяет эту новую линию от остальных..(то бишь разницу).. или у тебя отделяет?
XOR у меня выделяет эту линию красным цветом..
PM MAIL   Вверх
Alexeis
Дата 4.1.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата(DelphiFun @  4.1.2007,  22:02 Найти цитируемый пост)
XOR у меня выделяет эту линию красным цветом.. 

Правильно красным!
А кто сказал, должно быть по другому? Это же XOR! может попробовать посчитать какой получится результат (0х00FFFF XOR 0xFFFFFF). Подскажу 1 XOR 1 = 0, 1 XOR 0 = 1. 
  Теперь ясно почему результат 0xFF0000 ?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.