Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2011, 15:58   #1
skilful
Новичок
Джуниор
 
Регистрация: 27.01.2011
Сообщений: 5
По умолчанию масштабирование содержимого экрана

Всем привет.

Возникла следующая задачка: нужно то, что отображается на мониторе масштабировать (в моем случае уменьшить) и далее пересылать по сети. Масштабирование у меня означает "хватание" пикселей экрана с некоторым интервалом между "хватанием"

Причем то, что отображается на экране может быть любого содержания - видео, игра, текст...

Начал решение своей задачи с "грабинга" содержимого экрана.
Какой метод решения будет наиболее быстрым? Через scanline ?

Спасибо

Последний раз редактировалось skilful; 27.01.2011 в 16:05.
skilful вне форума Ответить с цитированием
Старый 27.01.2011, 16:25   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Сотни раз уже приводились готовые коды "граббинга" :
Код:
Как сделать BMP снимок с экрана?

Грузин: 

var
  Desktopcanvas :TCanvas ;
 BitMap  :TBitMap;
begin
  DesktopCanvas:=TCanvas.Create;
  DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);
  BitMap := TBitMap.Create;
  BitMap.Width := Screen.Width;
  BitMap.Height:=Screen.Height;
  Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect,
  DesktopCanvas, DesktopCanvas.ClipRect);
  bitmap.SaveToFile('c:\windows\screen.bmp');
 image1.Picture.LoadFromFile('c:\windows\screen.bmp');
end;

*****************************************************
Alar:

var 
ScreenDC:HDC; 
Canvas:TCanvas; 
Image1:TImage; 
begin 
ScreenDC := GetDC(0); 
Canvas:=TCanvas.Create(); 
Canvas.Handle:=ScreenDC; 
Image1 := TImage.Create(nil); 
Image1.Width := Screen.Width; 
Image1.Height := Screen.Height; 
Image1.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height), Canvas, Rect(0, 0, Screen.Width, Screen.Height)); 
ReleaseDC(0,ScreenDC); 
Canvas.Free; 
end;
******************************************************
maxionans:

var
  DC : HDC;
  Bmp : TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    DC := GetDC( 0 );
    Bmp.SetSize( 100, 100 );
    BitBlt( Bmp.Canvas.Handle, 0, 0, 100, 100, DC, 0, 0, SRCCOPY );
    Bmp.SaveToFile( 'c:\test.bmp' );
    ReleaseDC( 0, DC );
  finally
    Bmp.Free;
  end;
end;

Как сделать JPG снимок с экрана?

mihali4:

var
ScreenDC:HDC;
Canvas:TCanvas;
myjpg:  TJPEGImage;
Image: TImage;
Begin
Image:=TImage.Create(nil);
myjpg:= TJPEGImage.Create;
ScreenDC := GetDC(0); 
Canvas:=TCanvas.Create();
Canvas.Handle:=ScreenDC;
Image.Width := Screen.Width;
Image.Height := Screen.Height;
Image.Canvas.CopyRect(Rect(0, 0, Image.Width, Image.Height), Canvas, Rect(0, 0, Screen.Width, Screen.Height));
ReleaseDC(0,ScreenDC);
myjpg.Assign(Image.Picture.Bitmap);
myjpg.compressionquality:=75; {устанавливаем параметры качества. Должно быть от 1 до 100. Если 100, то качество наилучшее, 1 наихудшее}
myjpg.compress; {производим сжатие данных картинки}
myjpg.SaveToFile('c:\prob.jpg');
Image.Free;
Canvas.Free; 
end;
А масштабирование - это не "хватание пикселов", а установка нужных параметров высоты и ширины у TImage с установленным свойством Stretch(True) и сброшенным свойством Autosize(False)...
asmodey1 вне форума Ответить с цитированием
Старый 27.01.2011, 16:39   #3
skilful
Новичок
Джуниор
 
Регистрация: 27.01.2011
Сообщений: 5
По умолчанию

А если я немного изменю условия задачи.

Мне нужно хватать каждый пиксель координаты которого кратны некоторому числу. Пусть будет 8-ми
skilful вне форума Ответить с цитированием
Старый 27.01.2011, 16:42   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все равно принцип почти тот же, вы меняете уже принцип масштабирования.
идет так:
1)делается снимок экрана
2)масштабируется как надо.
в вашем случае(да и не тока) ScanLine лучше,(для исходного и целевого битмапа)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.01.2011, 16:48   #5
skilful
Новичок
Джуниор
 
Регистрация: 27.01.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
Сотни раз уже приводились готовые коды "граббинга" :

Грузин:

var
Desktopcanvas :TCanvas ;
BitMap :TBitMap;
begin
DesktopCanvas:=TCanvas.Create;
DesktopCanvas.Handle:=GetDC(Hwnd_De sktop);
BitMap := TBitMap.Create;
BitMap.Width := Screen.Width;
BitMap.Height:=Screen.Height;
Bitmap.Canvas.CopyRect(Bitmap.Canva s.ClipRect,
DesktopCanvas, DesktopCanvas.ClipRect);
bitmap.SaveToFile('c:\windows\scree n.bmp');
image1.Picture.LoadFromFile('c:\win dows\screen.bmp');
end;

в сохраненном файле вместо видео черная область. В чем проблема?
skilful вне форума Ответить с цитированием
Старый 27.01.2011, 17:16   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в DirectX.
другой механизм вывода на экран.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.01.2011, 17:48   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
skilful
Ты ведь бота для игры пишешь? Или трейнер для игры?
Это не так просто. Нужно знать механизмы игры.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.01.2011, 17:57   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

скорее аналог teamviewer
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.01.2011, 18:38   #9
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от skilful Посмотреть сообщение
в сохраненном файле вместо видео черная область. В чем проблема?
Простите, о каком-таком ВИДЕО идет речь ???
Не знаю, что там у вас за система, у меня все нормально - я попробовал.
А у вас, небось, семерка с кучей "украшалок" типа "аэро" ?
Ну, вот с этой дрянью многие программы не могут работать...

З.Ы. У меня ХР, Дельфи 7.
asmodey1 вне форума Ответить с цитированием
Старый 27.01.2011, 18:49   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Асмодей, проиграйте видео любым плеером, который поддерживает overlay, и получите чорную дыру. это тыщу лет уже так, нечо на висту бочку катить
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
масштабирование формы street-walker Общие вопросы Delphi 8 07.01.2010 22:43
Масштабирование Град Microsoft Office Excel 6 24.10.2008 09:23
масштабирование Alex_Pro Общие вопросы .NET 0 21.05.2008 18:21
масштабирование lenivec Общие вопросы Delphi 1 23.02.2008 07:07