2017-03-31 1 views
1

나는 CefSharp 55.0.0WinForms을 사용하고 있습니다.DPI 설정이 높은 window.scroll을 사용하여 스크린 샷 캡처하기

CefSharp에서 스크린 샷을 찍으려면 JavaScript 내에서 window.scroll을 사용하여 웹 페이지를 스크롤하고 현재 뷰포트의 이미지를 찍으십시오. 완료되면 다시 함께 다시 꿰맬 수 있습니다. 이것은 DPI 설정이 100%으로 설정된 모니터에서 정상적으로 작동합니다. 그러나 DPI (100%) 스크린 샷보다 큰 모니터는 예상대로 작동하지 않으며 콘텐츠가 누락됩니다.

이미지 1~100%

enter image description here

이미지 2-150% 둘 다 (실제로는) 가지고 있지만

enter image description here

이미지 2로 이미지 1 비교 동일한 너비와 높이, 이미지 2는 완벽한 이미지 1에 비해 콘텐츠의 상당 부분을 누락합니다.

설정이 100% 이상인 경우 설정이 100% 인 경우 모든 것을 얻을 수 있도록 캡쳐 화면을 올바르게 스크롤하고 캡처하려면 어떻게해야합니까?

기타 자세한 사항

응용 프로그램은 app.manifest 파일에 올바른 DPI 인식 설정을 가지고 있으며, Cef.EnableHighDPISupport();Program.csMain 방법으로 불려왔다. (요약본)

스크린 샷 코드

int scrollHeight = GetDocHeight(); //some javascript that calcs the height of the document 
int viewportHeight = ClientRectangle.Size.Height; 
int viewportWidth = ClientRectangle.Size.Width; 
int count = 0; 
int pageLeft = scrollHeight; 
bool atBottom = false; 

while (!atBottom) 
{ 
    if (pageLeft > viewportHeight) 
    { 
     await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { window.scroll(0," + (count * viewportHeight) + "); })();"); //I think the issue lies here 
     count++; 
     await PutTaskDelay(); 
     using (Bitmap image = GetCurrentViewScreenshot()) 
     { 
      //just a class that saves the partial images to a disk cache 
      cache.AddImage(count, image); 
     } 
    } 
    else 
    { 

     await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { window.scrollBy(0," + pageLeft + "); })();"); 

     atBottom = true; 
     count++; 

     await PutTaskDelay(); 
     Rectangle cropRect = new Rectangle(new Point(0, viewportHeight - pageLeft), new Size(viewportWidth, pageLeft)); 

     using (Bitmap src = GetCurrentViewScreenshot()) 
     using (Bitmap target = new Bitmap(cropRect.Width, cropRect.Height)) 
     using (Graphics g = Graphics.FromImage(target)) 
     { 
      g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel); 
      cache.AddImage(count, target); 
     } 

    } 
    pageLeft = pageLeft - viewportHeight; 
} 

현재 스크린 샷보기 방법

private Bitmap GetCurrentViewScreenshot() 
{ 
    int width, height; 
    width = ClientRectangle.Width; 
    height = ClientRectangle.Height; 


    using (Bitmap image = new Bitmap(width, height)) 
    { 
     using (Graphics graphics = Graphics.FromImage(image)) 
     { 
      Point p, upperLeftDestination; 
      Point upperLeftSource = new Point(0, 0); 
      p = new Point(0, 0); 
      upperLeftSource = PointToScreen(p); 
      upperLeftDestination = new Point(0, 0); 
      Size blockRegionSize = ClientRectangle.Size; 
      graphics.CopyFromScreen(upperLeftSource, upperLeftDestination, blockRegionSize); 

     } 
     return new Bitmap(image); 
    } 
} 
+0

'viewportHeight'를 사용하여 페이지를 스크롤하면 댓글이 제시하는대로 문제가 발생할 가능성이 높습니다. 브라우저의 높이와 일치하도록 값을 조정하거나 단순히 브라우저의 너비/높이를 볼 수있는 범위에서 조정할 수 있습니다. 또한 중복을 줄이기 위해 코드를 리팩토링하는 방법을 살펴볼 것입니다. 또한'GetDocHeight'를 적절한 비동기 메소드로 만들 것입니다 ('Wait()'사용을 피하십시오). – amaitland

+0

@amaitland 감사합니다. 내가 스크린 샷을보고있는 동안 큰 리팩터링을 제공 할 것입니다.이 코드는 원래'Document'에 깔끔한 컨트롤을 제공하는'WebBrowser' 컨트롤을 위해 만들어졌고 ('끔찍한 컨트롤에 관한 유일한 좋은 점에 대해서),'CefSharp'로 변환했을 때 주목받지 못했습니다 그들은 마땅했다. 다시 한번 감사드립니다. – TEK

답변

0

하지 않는 완벽한 솔루션, 나는에 1force-device-scale-factor 플래그를 설정 포함 해결 방법을 발견하는 동안 CefSettings. 브라우저가 높은 디스플레이로 확장되지 않기 때문에 완벽하지 않습니다. 잠재적으로 사용자가 텍스트를 읽기 어려울 수 있습니다. 그러나 스크린 샷에 누락 된 데이터가 누적되는 문제를 해결합니다.

CefSettings settings = new CefSettings(); 
settings.CefCommandLineArgs.Add("force-device-scale-factor", "1"); 
Cef.Initialize(settings); 

이 질문에 대한 제안이 있으면 유용합니다. :-)