抓图---高手请进(100分)

  • 主题发起人 主题发起人 tg
  • 开始时间 开始时间
问题依然在继续~~~~
如何只针对文挡的单个页面进行拍照?
 
如何只针对文挡的单个页面进行拍照?
可不可以说的清楚点不太明白你想要的具体意思,
 
好的,是这样的。
Word的左下角有几个按钮
(普通视图,页面视图,大纲视图)
这几个是不同的方式显示Word文挡,
我需要的时候使用"页面视图",你可以打开个Word看一下,在页面视图与其他有什么不同。
最明显的地方就是,文挡不在铺满整个窗口,而是以一个实际比例大小的页面方式
在灰色的Word窗口中。
我要的是针对这个页面拍照,那些灰色的边界都不要拍照到照片里。
如果按照你上面提出的方法,灰色的背景也全部拍照到图片里了。
我只要在页面方式下的文挡框内容拍照。
 
这就有点难啦,不如通过计算背景色的方法,通过算法去掉那灰色的部分
 
我做了一个根据句柄截图的控件,可以截按钮等控件的图,你要吗?
 
精确解决此问题,愿400分赠送.
 
突然意识到这个问题需要更加深入的求解
 
哪位大侠能精确解决此问题,愿500分奉送。
我的积分多,我给的起!
 
没人顶了,自己顶一下,呵呵
 
Tg:给你一个思路,可能写起来有点麻烦
先word的文档窗口进行拍照,保存在bmp中,
然后用一个徇环
for y := 0 to .Bmp.Height - 1 do
for x := 0 to .Bmp.Width - 1 do begin
if (Bmp.Canvas.Pixels[x, y] <> 文档区背景色) then
算出上方背景色部分高度过:=Y-1;
end;
基它方向的如同上方一样处理,应该可以
 
//tg临时写的函数,看看可不可以
procedure copybitmap(bmp, outbmp : tbitmap; backcolor ; tcolor)
var
r, r1 : trect;
begin
for y := 0 to Bmp.Height - 1 do
for x := 0 to Bmp.Width - 1 do begin
if (Bmp.Canvas.Pixels[x, y] <> backcolor ) then
r.top :=Y-1;
end;
for x := 0 to Bmp.Width - 1 do
for y := 0 to Bmp.Height - 1 do begin
if (Bmp.Canvas.Pixels[x, y] <> backcolor ) then
r.left := x-1;
end;
for x := Bmp.Width - 1 downto 0 do
for y := 0 to Bmp.Height - 1 do begin
if (Bmp.Canvas.Pixels[x, y] <> backcolor ) then
r.right := x+1;
end;
for y := Bmp.Height - 1 downto 0 do
for x := 0 to Bmp.Width - 1 do begin
if (Bmp.Canvas.Pixels[x, y] <> backcolor ) then
r.right := y+1;
end;
r1 ;= r;
offestrect(r1, 0, 0);
outbitmap.copyrect(r1, bmp.canvas, r);
end;
 
真的谢谢你。这办法其实你前面就提出方案来了。
多问句:有无函数或者消息的方法直接取出那文档页?
 
这我就不太清楚,不过人可以去问问那些OLE高手,看能不能通过OLE的方式直接取出来
至于函数和消息恐怕就没有啦
 
这个可不单单是抓图。
换个思路
能否根据WORD本身的内容在内存中重新绘制页面?
 
//TG:呵,我又来啦,看来你这两百分我拿不到是不甘心啦
//我有一个想法,不过不知行不,我机子里没有word,我给你代码,你自己试试
//我的想法是,word的编辑窗口也是用riched20.dll作的,那么我么可以用打印
//TRichEdit控件的方法来打印word的文档窗口,嘿,当然我们打印的画布是不
//是打印机的画布,是我们自定义的图片的画布,这样我们就能取得没有背景
//的文档部分
procedure GetWordImage(word ; Handle; Img ; timage);
var
Range : TFormatRange;
LastChar, MaxLen, LogX, LogY: Integer;
begin
FillChar(Range, SizeOf(TFormatRange), 0);
with Img, Range do begin
LogX := GetDeviceCaps(Canvas.Handle, LOGPIXELSX);
LogY := GetDeviceCaps(Canvas.Handle, LOGPIXELSY);
hdc := Canvas.Handle;
hdcTarget := hdc;
rc.right := Img.ClientWidth * 1440 div LogX;
rc.bottom := Img.ClientHeight * 1440 div LogY;
rcPage := rc;
LastChar := 0;
MaxLen := GetTextLen;
chrg.cpMax := -1;
repeat
chrg.cpMin := LastChar;
LastChar := SendMessage(word, EM_FORMATRANGE, 1,Longint(@Range));
until (LastChar >= MaxLen) or (LastChar = -1);
end;
SendMessage(RichEdit1.Handle, EM_FORMATRANGE, 0, 0);
Img.Refresh;
end;
//哈,你看看吧,我也不知道,还没试过
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
901
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
961
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部