С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Maxsis
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 157
1

Как сделать скриншот нужных мне координат в webbrowser?

04.11.2014, 12:47. Просмотров 1228. Ответов 8
Метки нет (Все метки)

Здравствуйте формчани)
Прошу помощи, так как уже 2 дня не могу понять как сделать скриншот нужной области.

Вот код снимка
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
procedure generateJPEGfromBrowser(browser: iWebBrowser2; jpegFQFilename: string;
 srcHeight: Integer; srcWidth: Integer; tarHeight: Integer; tarWidth: Integer);
var
 sourceDrawRect: TRect;
 targetDrawRect: TRect;
 sourceBitmap: TBitmap;
 targetBitmap: TBitmap;
 jpeg: TJPEGImage;
 viewObject: IViewObject;
begin
 sourceBitmap := TBitmap.Create;
 targetBitmap := TBitmap.Create;
 jpeg := TJPEGImage.Create;
 try
   try
     sourceDrawRect := Rect(0, 0, srcWidth, srcHeight);
     sourceBitmap.Width  := srcWidth;
     sourceBitmap.Height := srcHeight;
 
     viewObject := browser as IViewObject;
 
     if viewObject = nil then
       Exit;
 
     OleCheck(viewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Form1.Handle,
       sourceBitmap.Canvas.Handle, @sourceDrawRect, nil, nil, 0));
 
     // Resize the src bitmap to the target bitmap
     targetDrawRect := Rect(0, 0, tarWidth, tarHeight);
     targetBitmap.Height := tarHeight;
     targetBitmap.Width  := tarWidth;
     targetBitmap.Canvas.StretchDraw(targetDrawRect, sourceBitmap);
 
     // Create a JPEG from the Bitmap and save it
     jpeg.Assign(targetBitmap);
 
     jpeg.SaveToFile(jpegFQFilename);
   finally
     jpeg.Free;
     sourceBitmap.Free;
     targetBitmap.Free;
   end;
 except
   // Error Code
 end;
end;
 
procedure WebBrowserPrintScreen( Browser: TWebBrowser; Path: string );
var
  bm: TBitmap;
  ViewObject: IViewObject;
  SRect: TRect;
  jpeg0: TJPEGImage;
begin
   if Browser.Document <> nil then
   try
      Browser.Document.QueryInterface( IViewObject, ViewObject );
      if ViewObject <> nil then
      try
         bm := TBitmap.Create;
         jpeg0 := TJPEGImage.Create;
         bm.Width := Browser.Width;
         bm.Height := Browser.Height;
         SRect := Rect( 0, 0, bm.Width, bm.Height );
         ViewObject.Draw( DVASPECT_CONTENT, 1, nil, nil, Browser.Handle,
                          bm.Canvas.Handle, @SRect, nil, nil, 0 );
         bm.SaveToFile( Path );
         jpeg0.Assign(bm);
      finally
      jpeg0.free;
         bm.Free;
         ViewObject._Release;
      end;
   except
   end;
end;
 
 
procedure TForm1.Button6Click(Sender: TObject);
begin
   WebBrowserPrintScreen(Form1.
   WebBrowser2, 'Screen.jpg' );
 
end;
Снимок выглядит, так:
Как сделать скриншот нужных мне координат в webbrowser?


Как сделать, чтобы был скриншот только логотипа яндекса? Как и где указывать координаты?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2014, 12:47
Ответы с готовыми решениями:

Как мне сделать компонент похожий на TEdit только отличается внешне
Хотел сделать компонент своего вида (то есть преписать процедуру Paint). Кнопку...

Сделать скриншот свернутого приложения
Фрапс умеет такое делать.. Как бы мне делфи такому научить??? В сети есть...

Как мне сделать вывод Фигуры не кликом, а так: нажимаю-выбираю нужный размер-отпускаю
вот фигура

Как сделать, чтобы по нажатию на определенную ячейку StrinGrid появлялась одна из нужных мне картинок?
как сделать,чтобы по нажатию на определенную ячейку stringrid появлялась одна...

Как сделать чтобы счетчик считал нажатия нужных кнопок?
Всем привет. У меня есть массив кнопок, создан динамически. Не получается...

8
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
04.11.2014, 14:16 2
Цитата Сообщение от Maxsis Посмотреть сообщение
где указывать координаты?

IViewObject:: Draw method
стоит попробовать
HRESULT Draw(
[in] DWORD dwDrawAspect,
[in] LONG lindex,
[in] void *pvAspect,
[in] DVTARGETDEVICE *ptd,
[in] HDC hdcTargetDev,
[in] HDC hdcDraw,
[in] LPCRECTL lprcBounds,
[in] LPCRECTL lprcWBounds,
[in] BOOL (*pfnContinue)(ULONG_PTR dwContinue),
[in] ULONG_PTR dwContinue
);
...
lprcBounds [in]

Pointer to a RECTL structure specifying the rectangle on hdcDraw and in which the object should be drawn. This parameter controls the positioning and stretching of the object. This parameter should be NULL to draw a windowless in-place active object. In every other situation, NULL is not a legal value and should result in an E_INVALIDARG error code. If the container passes a non-NULL value to a windowless object, the object should render the requested aspect into the specified device context and rectangle. A container can request this from a windowless object to render a second, non-active view of the object or to print the object.
...
или сразу скачивать интересующую картинку по известному из содержимого страницы адреса
0
Maxsis
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 157
04.11.2014, 16:13  [ТС] 3
Цитата Сообщение от cotseec Посмотреть сообщение
или сразу скачивать интересующую картинку по известному из содержимого страницы адреса
Уважаемый cotseec. Я не понял вашего ответа. Зачем мне функция из C++, если мы говорим о конктретном примере на языке pascal (а точнее delphi)? Тем более, я не хочу использовать другие методы. Я хотел, чтобы люди поглядели на мои процедуры и сказали как и что в ней изменить чтобы получить нужный эффект.
И ТУТ ВАШ СОВЕТ, ЧТО ЯКОБЫ МОЖНО СКАЧАТЬ ПО ПРЯМОЙ ССЫЛКЕ КАРТИНКУ - МНЕ НЕ ПОДХОДИТ, Я БУДУ ДЕЛАТЬ СКРИНШОТЫ ФЛЕШ-СКРИПТОВ И ФЛЕШ ИГР.

КОРОЧЕ, НУЖНО ЧТОБЫ СНИМОК БЫЛ ОПРЕДЕЛЕНОЙ ЧАСТИ ЭКРАНА, НАПРИМЕР СДЕЛАТЬ СКРИНШОТ НАЧИНАЯ С ТОЧЕК(пикселей) 100,100 ПО 200,200
0
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
04.11.2014, 16:27 4
Цитата Сообщение от Maxsis Посмотреть сообщение
Зачем мне функция из C++,
это такая же функция для Delphi, уж если где-то нашли код, то попробуйте его понять

в приведенном вами же коде используются COM интерфейсы передачи данных из DOM
Цитата Сообщение от MSDN
....to create compound documents and perform data transfer....
в частности IViewObject, по приведенной мной ссылке есть описание метода, используемого в вашем же коде, в этом методе задается в том числе прямоугольник (тип TRect) для копирования, тот, который как раз и есть
Цитата Сообщение от Maxsis Посмотреть сообщение
НАЧИНАЯ С ТОЧЕК(пикселей) 100,100 ПО 200,200
если уж совсем нет желания разбираться, то ничего не мешает из имеющегося принтскрина из браузера (полученного приведенным кодом) выдрать требуемый прямоугольник

успехов
0
Maxsis
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 157
04.11.2014, 16:39  [ТС] 5
Цитата Сообщение от cotseec Посмотреть сообщение
успехов
__________________
спасибо, НО! Я не понял зачем ты мне пишешь про вытаскивание из DOM и так далее... Мне "пофиг", что будет в содержимом webbrowser. Мне просто нужно снять не все окно браузера, а маленький прямоугольник выставленный по моим кординатам!
Как сделать скриншот нужных мне координат в webbrowser?
0
cotseec
04.11.2014, 16:49
  #6

Не по теме:

Цитата Сообщение от Maxsis Посмотреть сообщение
Я не понял зачем ты мне пишешь про вытаскивание из DOM и так далее...
не обращай внимания, это я так, клавиатуру новую опробывал

0
Maxsis
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 157
04.11.2014, 17:27  [ТС] 7
Цитата Сообщение от cotseec Посмотреть сообщение
не обращай внимания, это я так, клавиатуру новую опробывал
Клава у тебя норм, но набираешь не по теме.
КАК ЖЕ МНЕ ОБЪЯСНИТЬ... Ты ешь конфеты мишки в лесу? так вот... представь обертка конфеты лежит на столе... тебе понравилась картинка на обертке и ты хочешь отправить ее мне в виде фотки...
твои действия, ты кладешь обертку на стол, берешь айфон свой и фоткаешь... теперь представь что у тебя на том же столе лежат пароли и когда ты снимал обертку ты снял и их... значит ты должен обрезать фотку программно, чтобы была видна только оберткп!

Я ХОЧУ ТАКЖЕ, НО ВМЕСТО СТОЛА У МЕНЯ СОД. ВЕБ СТРАНИЦЫ, А ОБЕРТКА ЭТО ЛОГОТИП!

ЛОЛ)
0
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
04.11.2014, 20:35 8
Лучший ответ Сообщение было отмечено Maxsis как решение

Решение

Maxsis, мне вроде понятно было изначально, а тебе, похоже, совсем не ясно, о чем я говорил - беда копипасты

Осуществил эксперимент - поигрался с параметрами метода Draw интерфейса IViewObject - то, о чем я писал, задает размер В который копировать, а НЕ который копировать (вся область браузера будет вписана в указанный прямоугольник - об этом, в принципе, и сообщали тов. из Редмонда)
если просто вырезать из полученной картинки, то на основе приведенной процедуры:
пример процедуры
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
procedure BrowserClipPicture (Browser: TWebBrowser {объект браузера}; 
                              const Path: string {путь, куда сохранять картинку}; 
                              const RectPic: TRect {прямоугольник, который необходимо скопировать});
var
  BmpPic, tmpPic: TBitmap;
  ViewObject: IViewObject;
  SRect: TRect;
  JpegPic: TJPEGImage;
begin
  OleInitialize(nil);
 
  if Assigned(Browser.Document) then
    if Succeeded(Browser.Document.QueryInterface(IViewObject, ViewObject)) then
    begin
      BmpPic := TBitmap.Create;
      tmpPic := TBitmap.Create;
      JpegPic := TJPEGImage.Create;
 
      BmpPic.Width := Browser.Width;
      BmpPic.Height := Browser.Height;
      SRect := Rect(0, 0, BmpPic.Width, BmpPic.Height);
 
      if Succeeded(ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Browser.Handle,
                                   BmpPic.Canvas.Handle, @SRect, nil, nil, 0)) then
      begin
        tmpPic.Width := RectPic.Right - RectPic.Left;
        tmpPic.Height := RectPic.Bottom - RectPic.Top;
        tmpPic.Canvas.CopyRect(tmpPic.Canvas.ClipRect, BmpPic.Canvas, RectPic);
 
        JpegPic.Assign(tmpPic);
        JpegPic.SaveToFile(Path);
      end;
 
      JpegPic.free;
      BmpPic.Free;
      tmpPic.Free;
    end;
 
  ViewObject := nil;
  OleUninitialize;
end;


в итоге такая картина
Как сделать скриншот нужных мне координат в webbrowser?
1
Maxsis
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 157
04.11.2014, 20:43  [ТС] 9
Цитата Сообщение от cotseec Посмотреть сообщение
в итоге такая картина
ай да кот, ай да хорош. кинул бы архив с проектом начал бы на тебя молиться)))
п.с. не знаю как юзать правильно(только догадки, буду разбираться).

Но блин, за код спасибо))
0
04.11.2014, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2014, 20:43

Как сделать скриншот компонента Panel
Здравствуйте! У меня на форме есть Panel, а на ней несколько TLabel'ов,...

Как сделать скриншот экрана и отправить его по локальной сети
Как сделать скриншот экрана и отправить его по локальной сети, так чтобы не...

Как мне нажать на одну из ссылок через Webbrowser в VB?
У меня есть вот такая ХТМЛ страница: &lt;FORM style='DISPLAY: inline'...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru