谁有兴趣研究《滚动截图》技术!(80分)

  • 主题发起人 主题发起人 bottom
  • 开始时间 开始时间
B

bottom

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有兴趣研究《滚动截图》技术!
什么是滚动截图?
比如:
1)一个 文本(或是其他什么都行)
他的内容很多,那么会出现滚动条,
2)那么滚动截图 :就是说从头滚动到尾的过程中,
把滚动过程看到的景物都截出来自动,连成一张图片 !!
3)谁有资料吗?
如果大家看不懂可以看看 老外做的产品:
SnagIt V7.02
http://www.skycn.com/soft/2290.html

4)偶认为有三个大步骤要考虑:
1》如何发送消息让 其他应用程序的滚动条
自动滚动?
2》在滚动过程中如何控制每次滚动 的高度(垂直方向)
和宽度(水平方向滚动条)???
3》每次滚动截到的图片如何把他们 不留痕迹的
连在一起??

如果大家看不懂可以看看 老外做的产品:
SnagIt V7.02
http://www.skycn.com/soft/2290.html
 
有兴趣,可能春节前没时间
 
up偶 哪为大哥帮忙啊!
 
Q: How can I save a web page to a bitmap?

A: Here's a code sample:

procedure TForm1.Button1Click(Sender: TObject);
var
ViewObject: IViewObject;
sourceDrawRect: TRect;
begin
if EmbeddedWB1.Document <> nil then
try
EmbeddedWB1.Document.QueryInterface(IViewObject, ViewObject);
if ViewObject <> nil then
try
sourceDrawRect := Rect(0, 0, Image1.Width, Image1.Height);
ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,
image1.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
finally
ViewObject._Release;
end;
except
end;
end;

This tip provided by John




Q: How can I save a web page to a bitmap?

A: Here's a code sample:

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, self.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) ;
makeFileWriteable(jpegFQFilename);
jpeg.SaveToFile (jpegFQFilename);
finally
jpeg.free;
sourceBitmap.free ;
targetBitmap.free;
end;
except
// Error Code
end;
end;
 
还没看那个软件,想了一会儿,好像很难实现。
获得窗口和使窗口滚动不是问题,但是控制不了每次滚动的高度和宽度,也不用控制这个。

先考虑只有垂直滚动条的情况:
先把该窗口的 ScrollBar 设置为最上
检查 Pos 是否等于 Max,如果是,则说明滚动条无效,直接 BitBlt 窗口就可以了
否则再获得 ScrollBarInfo.Min/Max/Pos 信息
使用 SendMessage 使 ScrollBar 往下滚动 1 个单位
BitBlt 截图保存
重复上面三个过程,直到 Pos = Max
最后分析每行截图的内容是否有相同,如果有则删除该行图像
把几副片段组合起来。

水平滚动的情况可以迭代调用垂直的情况实现。
 
有难度,帮顶
 
savetime,大哥算法是比较容易想到可是具体做起来
并不容易呀!
"直接 BitBlt 窗口就可以了
":什么意思啊,怎么捕获每次的举行快大小啊
 
>> 怎么捕获每次的举行快大小啊
所以我说:好像很难实现。
我只能想到:最后分析每行截图的内容是否有相同,如果有则删除该行图像
我见过一个全景图像的软件,就是分析图片的边缘是否重合来将多幅图片组合起来的。
 
游戏中可不可以?
 
TO:QSmile 大哥游戏中,是不行,因为游戏启动后 那个截图软件的菜单就无法控制了
TO:savetime, 大哥可有代码资料么?
 
你想啊,一个窗口的 WM_PAINT 只显示窗口大小的内容,因此即使获得了它的 Paint 过程也是没有用的。必须让它自己把图像画出来,然后拷贝整个窗口内容,再调用 Scroll,获得未显示出来的内容,最后再拼起来。还能有什么更取巧的办法,我想不到。

虽然这个问题比较有趣,但现在在学 COM,没有时间研究这个问题。如果汇编功力好,就把上面说的软件反汇编看看它是怎么实现的。
 
这种软件大多是 VC写的 偶猜想MFC类库中可能又现成的什么辅助技术吧!
大哥还请多帮忙:)谢谢啦!
 
我觉得结果可能与美萍的远程监控功能差不多吧。
 
alexanderg,大哥能不能给些技术上的原代码啊?谢谢啦!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部