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

Поиск:

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


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Задача: отправлять на удаленный ПК состояние экрана.
Про сеть упомянул в связи с желанием минимизировать объем передаваемых данных. Кроме того, при желании иметь на целевом компе комфортное кадрочередование(ну, не меньше 10 кадров в секунду) не хотел бы загружать мониторимый комп частыми вычислениями. Надумал три стратегии(метод мозгового штурма - сразу же ногами не пинать smile)
1. Съемка по таймеру.
Плюс: простота реализации.
Минусы: - нагрузка на сеть
              - нагрузка на процессор
2. Съемка по запросу клиента. Возможен вариант ответа "ничего не изменилось, используй предыдущую картинку".
Плюс: не требуют - не снимаем(меньше нагрузка на процессор мониторимой машины), меньше нагрузка на сеть(можно получать ответ "ничего не изменилось, рисуй, что было раньше")
Минусы: - необходимо как-то фиксировать, что "изменений не было" на мониториемой машине - либо побитовое сравнение образов, либо ещё как. 
             - при нескольких клиентах нагрузка на сеть нерационально высока(нельзя на запрос одного клиента бросить широковещательный запрос - остальным клиентам может не пригодиться)
3. Съемка по событию(перехват сообщения на перерисовку и подобное). 
Плюс: можем бросать при изменении широковещательный пакет, все остальное время не передавать ничего - нагрузка на сеть минимальна, процессор загружен только когда надо.
Минус: сложность реализации
---------------------
Вопрос: какие ещё возможны варианты?
PM MAIL   Вверх
dumb
Дата 14.11.2006, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



очевидно, что 3 вариант оптимален. только вот думается, что без ограничения скорости "обновления" все равно не обойтись. и broadcast, наверное, лучше не делать - 2-3 секретарши, активно перебирающих претендентов на каких-нибудь "знакомства.ру", завалят сеть. smile
PM MAIL   Вверх
Akella
Дата 14.11.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



тебе нужно сделать такую опцию, как в RAdmin (для регулировки нагрузки на сеть и на процессор):
1. количество снимков в минуту или секунду
2. глубина цвета.
PM MAIL   Вверх
skyboy
Дата 14.11.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



dumb, ну, некая "регистрация" клиентов все равно будет, и широковещение будет применяться только при количестве клиентов более 5-6, да и к секретаршам не попадет smile))
Цитата(Akella @  14.11.2006,  08:32 Найти цитируемый пост)
2. глубина цвета. 

некритично. сжимать буду JPEG - размеры вряд ли будут большие...
Цитата(Akella @  14.11.2006,  08:32 Найти цитируемый пост)
количество снимков в минуту или секунду

дык, если юзать вариант 2 или вариант 3 это вообще не надо - съемка будет инициироваться "когда надо" smile
PM MAIL   Вверх
artem1987
Дата 14.11.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

3. Съемка по событию(перехват сообщения на перерисовку и подобное). 
Плюс: можем бросать при изменении широковещательный пакет, все остальное время не передавать ничего - нагрузка на сеть минимальна, процессор загружен только когда надо.
Минус: сложность реализации

если только на мониторимом компе проги со скромной графикой , представь у Picasa сколь WMPaint ходит.
--------------------
Don't ask me why, ask me how.
PM MAIL   Вверх
Alexeis
Дата 14.11.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(skyboy @  14.11.2006,  10:22 Найти цитируемый пост)
некритично. сжимать буду JPEG - размеры вряд ли будут большие...

 smile  smile 

Добавлено @ 18:10 
Еще бы в PNG жал smile .  Это же пол секунды кадр! + бешаная загрузка проца клиента.
Я бы вычитал два соседних кадра и жал все это в RLE, так хоть есть шанс, что машина успеет сжать. Да и разностная картинка будет иметь много черных полей, которые отлично и без нагрузки жмет это самое RLE. 

Это сообщение отредактировал(а) alexeis1 - 14.11.2006, 18:11


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

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

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


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Я что-то не понял. skyboy, ты собираешься "фоткать" экран клиента и каждый раз отправлять картинку? Глупо. Я бы отправлял только то, что изменилось. Т.е. програма на "сервере" анализиует предыдущий "снимок" и сравнивает с нынешним. Разнице отправляет клиенту. Клиент принимет, анализиует что изменилось и отображает уже новую картинку, с учетом полученной разницы. Таким образом можно уменшить траффик в десятки раз, при этом не создавать эффект "кадрирования", как при "фотографировании" по таймеру.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
W1zArD
Дата 15.11.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 3



Poseidon если я не путаю... то gif работает на таком же принципе...
PM   Вверх
skyboy
Дата 15.11.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



ну, блин, маньяки %) я не спросил, что лучше, что - хуже... просто поинтересовался - имеются ли другие варианты... а вы сразу - в критику smile
Цитата(Poseidon @  14.11.2006,  23:03 Найти цитируемый пост)
Т.е. програма на "сервере" анализиует предыдущий "снимок" и сравнивает с нынешним. Разнице отправляет клиенту.

Ты об этом, Poseidon:
Цитата(alexeis1 @  14.11.2006,  17:06 Найти цитируемый пост)
Я бы вычитал два соседних кадра и жал все это в RLE, так хоть есть шанс, что машина успеет сжать. Да и разностная картинка будет иметь много черных полей, которые отлично и без нагрузки жмет это самое RLE. 

?

PM MAIL   Вверх
Poseidon
Дата 16.11.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(skyboy @  15.11.2006,  23:31 Найти цитируемый пост)
Ты об этом, Poseidon:
 Скорее всего...



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
DelphiFun
Дата 1.1.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хотелось всё-таки поднять этот вопрос...

Скажите, а в какой формат Вы бы порекомендовали сохранять кидаемый скриншот?
Чем потом жать или нет?
Видел тут RLE предлагали, это ли оптимальный вариант??
BMP, потом по нему RLE..?
PM MAIL   Вверх
skyboy
Дата 1.1.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



DelphiFun, если сам передаешь - зачем использовать какой-нить формат? сжимай в поток, распаковывай из потока... 
PM MAIL   Вверх
Alexeis
Дата 1.1.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



skyboy, конечно! Но кто мешает RLE самому написать, тем более, что у microsoft полностью описан алгоритм. Поскольку будет много черных полей, то RLE в этом случае подходит идеально. 


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

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

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


Новичок



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

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



А какие именно чёрные поля?
Мы отправляем ведь только изменённые куски..
PM MAIL   Вверх
skyboy
Дата 2.1.2007, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



DelphiFun, в том-то и фишка: видимо ты просто неполностью прочитал посты. предлагается передавать только изменения: для этого делать между соседними кадрами попиксельный(можно пройтись по компонентам цвета) XOR - после этой операции одинаковые участки станут девственно( smile ) чёрными - и эти последовательности одинакового цвета RLE сожмет куда лучше jpeg.
PM MAIL   Вверх
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   Вверх
DelphiFun
Дата 5.1.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



но кусок:
Код
        if ( RowBMP2[i] = RowBMP1[i] )    
        then    
          RowBMP3[i] := 0    
        else    
          RowBMP3[i] := RowBMP2[i];

также ведь не отделяет разницу... А вот он-то по идее должен.. нет разве?
PM MAIL   Вверх
Alexeis
Дата 5.1.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(DelphiFun @  5.1.2007,  01:07 Найти цитируемый пост)
также ведь не отделяет разницу... А вот он-то по идее должен.. нет разве? 

Чтобы так было, надо было сравнивать цвета целиком! А не составляющие R G B отдельно. Составляющие как раз могут и совпадать, а цвета целиком нет, вот и получается белиберда. Вот и выходит, что часть составляющих занулена, а часть нет, в результате на лицо непонятные обрывы и проч. Лучше всего как и сказали XOR он никогда не даст превышения уровня и всегда позволит произвести обратную операцию.


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

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

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


Новичок



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

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



Ха! действительно.. мы же сравниваем не цвета друг с другом..
А в случае с XOR'ом передавать именно эту картинку? 
А как же произвести накладку на предыдущий скриншот так, чтобы оно наложилось именно тем "цветом" который был изначально..? Ещё раз XOR'ом?
( странно спросил, я это и сам понял, не смог сформулировать точнее )
PM MAIL   Вверх
DelphiFun
Дата 5.1.2007, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кстати, а что означает "превышения уровня"? Какого уровня, о чем речь идёт? smile
PM MAIL   Вверх
Alexeis
Дата 5.1.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(DelphiFun @  5.1.2007,  01:59 Найти цитируемый пост)
А как же произвести накладку на предыдущий скриншот так, чтобы оно наложилось именно тем "цветом" который был изначально..? Ещё раз XOR'ом?

По идее да.

Цитата(DelphiFun @  5.1.2007,  01:59 Найти цитируемый пост)
А в случае с XOR'ом передавать именно эту картинку? 

Не совсем ее, точнее ее сжатый аналог.

Цитата(DelphiFun @  5.1.2007,  04:15 Найти цитируемый пост)
Кстати, а что означает "превышения уровня"? Какого уровня, о чем речь идёт? 


Составляющая цвета имеет 255 градаций, если скажем вычитать цвета, то например 212 - 220 = - 8, но такое число реально запишется как 247, потому что вышли из диапазона 0..255.


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

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

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


Новичок



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

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



Цитата
Не совсем ее, точнее ее сжатый аналог.

А, ну с этим понятно. С RLE я думаю проблем у меня не возникнет.


А обратно это XOR чего с чем? Одно это бит картинки, а второй?


Мне кажется такое впринципе не прокатит, потому как посмотри какая после XOR'а получается интересная разница... линия ( бирюзового цвета ) ведь ПОВЕРХ, а он в разнице отображает ещё и то, что было под ней... 
блин а как такое вообще возможно? smile

Таким макаром любую картинку сканировать можно на то, что было под верхней линией  smile 

На крайняк прийдётся сравнивать именно цвета объединяя несколько битов в один..
PM MAIL   Вверх
skyboy
Дата 5.1.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(DelphiFun @  5.1.2007,  13:52 Найти цитируемый пост)
А обратно это XOR чего с чем?

пришедшей маски изменения и предыдущего полученного кадра(тебе приходят изменения  - вот ты их и обрабатываешь, отталкиваясь от того, что было)
PM MAIL   Вверх
DelphiFun
Дата 5.1.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Работает!!!  smile 

skyboy, Alexeis, Спасибо большое за помощь в решении этой проблемы!!
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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