抓图--高分难题(200分)

  • 主题发起人 主题发起人 tg
  • 开始时间 开始时间
T

tg

Unregistered / Unconfirmed
GUEST, unregistred user!
本人正在用Deplhi的Servers下组件控制Word,希望对Word的Document进行拍照。
(不要把标题栏都拍照下来,只要拍照Word打开的Document部分)
详细的想实现这样一个功能:
用Deplhi的Servers下组件WordApplication打开Word.
打开一个文档,对当前页(Page)进行"拍照"(就是变为图片),
Dephi提供了Servers组件XX.CopyAsPicture的功能,不过你不妨一试,拍下来的图片效果非常差,象是有损压缩的,
请问采用什么技术能把当前页抓拍下来?

Word的左下角有几个按钮
(普通视图,页面视图,大纲视图)
这几个是不同的方式显示Word文挡,
我需要的时候使用"页面视图",你可以打开个Word看一下,在页面视图与其他有什么不同。
最明显的地方就是,文挡不在铺满整个窗口,而是以一个实际比例大小的页面方式
在灰色的Word窗口中。
我要的是针对这个页面拍照,那些灰色的边界都不要拍照到照片里。
我只要在页面方式下的文挡框内容拍照

请高手指点!
必有重谢!
 
我想一个变通的办法,我们知道打印机打印前会先作一个打印稿的映象,通常这是一个emf图像格式的,
你可以现模拟打印,然后取出这个图像,或者打印到文件然后在用程序专成图像,效果应该是比较好的。
 
XX.CopyAsPicture的XX是指什么?
 
例: WordDocument1.Range.CopyAsPicture
 
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;

 
真的谢谢你。这办法其实你前面就提出方案来了。
多问句:有无函数或者消息的方法直接取出那文档页?
 
//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;
//哈,你看看吧,我也不知道,还没试过
 
后退
顶部