Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 240
1

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

04.11.2014, 12:47. Показов 1950. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2014, 12:47
Ответы с готовыми решениями:

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

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

Как мне подключится к Proxy и дальше работать в WebBrowser?
Программисты подскажите как мне подключится как Proxy и дальше работать в WebBrowser. Вот например...

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

8
Пишу на Delphi...иногда
1419 / 1276 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
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
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 240
04.11.2014, 16:13  [ТС] 3
Цитата Сообщение от cotseec Посмотреть сообщение
или сразу скачивать интересующую картинку по известному из содержимого страницы адреса
Уважаемый cotseec. Я не понял вашего ответа. Зачем мне функция из C++, если мы говорим о конктретном примере на языке pascal (а точнее delphi)? Тем более, я не хочу использовать другие методы. Я хотел, чтобы люди поглядели на мои процедуры и сказали как и что в ней изменить чтобы получить нужный эффект.
И ТУТ ВАШ СОВЕТ, ЧТО ЯКОБЫ МОЖНО СКАЧАТЬ ПО ПРЯМОЙ ССЫЛКЕ КАРТИНКУ - МНЕ НЕ ПОДХОДИТ, Я БУДУ ДЕЛАТЬ СКРИНШОТЫ ФЛЕШ-СКРИПТОВ И ФЛЕШ ИГР.

КОРОЧЕ, НУЖНО ЧТОБЫ СНИМОК БЫЛ ОПРЕДЕЛЕНОЙ ЧАСТИ ЭКРАНА, НАПРИМЕР СДЕЛАТЬ СКРИНШОТ НАЧИНАЯ С ТОЧЕК(пикселей) 100,100 ПО 200,200
0
Пишу на Delphi...иногда
1419 / 1276 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
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
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 240
04.11.2014, 16:39  [ТС] 5
Цитата Сообщение от cotseec Посмотреть сообщение
успехов
__________________
спасибо, НО! Я не понял зачем ты мне пишешь про вытаскивание из DOM и так далее... Мне "пофиг", что будет в содержимом webbrowser. Мне просто нужно снять не все окно браузера, а маленький прямоугольник выставленный по моим кординатам!
Как сделать скриншот нужных мне координат в webbrowser?
0
cotseec
04.11.2014, 16:49
  #6

Не по теме:

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

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

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

ЛОЛ)
0
Пишу на Delphi...иногда
1419 / 1276 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
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
5 / 5 / 3
Регистрация: 10.06.2011
Сообщений: 240
04.11.2014, 20:43  [ТС] 9
Цитата Сообщение от cotseec Посмотреть сообщение
в итоге такая картина
ай да кот, ай да хорош. кинул бы архив с проектом начал бы на тебя молиться)))
п.с. не знаю как юзать правильно(только догадки, буду разбираться).

Но блин, за код спасибо))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2014, 20:43

Как сделать выбор только нужных файлов?
Проблема в том что в селекте файлов по дефолту выводятся все файлы которые есть в модели File чего...

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

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

Как сделать скриншот видео?
Здравствуйте, как сделать скриншот видео с помощью php, чтобы было так же как сжатие картинки...


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

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

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