나는 CefSharp 55.0.0
WinForms
을 사용하고 있습니다.DPI 설정이 높은 window.scroll을 사용하여 스크린 샷 캡처하기
CefSharp
에서 스크린 샷을 찍으려면 JavaScript 내에서 window.scroll
을 사용하여 웹 페이지를 스크롤하고 현재 뷰포트의 이미지를 찍으십시오. 완료되면 다시 함께 다시 꿰맬 수 있습니다. 이것은 DPI
설정이 100%
으로 설정된 모니터에서 정상적으로 작동합니다. 그러나 DPI
(100%
) 스크린 샷보다 큰 모니터는 예상대로 작동하지 않으며 콘텐츠가 누락됩니다.
이미지 1~100%
이미지 2-150% 둘 다 (실제로는) 가지고 있지만
이미지 2로 이미지 1 비교 동일한 너비와 높이, 이미지 2는 완벽한 이미지 1에 비해 콘텐츠의 상당 부분을 누락합니다.
설정이 100%
이상인 경우 설정이 100%
인 경우 모든 것을 얻을 수 있도록 캡쳐 화면을 올바르게 스크롤하고 캡처하려면 어떻게해야합니까?
기타 자세한 사항
응용 프로그램은 app.manifest
파일에 올바른 DPI 인식 설정을 가지고 있으며, Cef.EnableHighDPISupport();
는 Program.cs
내 Main
방법으로 불려왔다. (요약본)
스크린 샷 코드
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);
}
}
'viewportHeight'를 사용하여 페이지를 스크롤하면 댓글이 제시하는대로 문제가 발생할 가능성이 높습니다. 브라우저의 높이와 일치하도록 값을 조정하거나 단순히 브라우저의 너비/높이를 볼 수있는 범위에서 조정할 수 있습니다. 또한 중복을 줄이기 위해 코드를 리팩토링하는 방법을 살펴볼 것입니다. 또한'GetDocHeight'를 적절한 비동기 메소드로 만들 것입니다 ('Wait()'사용을 피하십시오). – amaitland
@amaitland 감사합니다. 내가 스크린 샷을보고있는 동안 큰 리팩터링을 제공 할 것입니다.이 코드는 원래'Document'에 깔끔한 컨트롤을 제공하는'WebBrowser' 컨트롤을 위해 만들어졌고 ('끔찍한 컨트롤에 관한 유일한 좋은 점에 대해서),'CefSharp'로 변환했을 때 주목받지 못했습니다 그들은 마땅했다. 다시 한번 감사드립니다. – TEK