图像打印(150分)

  • 主题发起人 主题发起人 noall
  • 开始时间 开始时间
N

noall

Unregistered / Unconfirmed
GUEST, unregistred user!
当绘完一张图后,送到打印机打印时.

应该什么做不失比例呢(也就是根据打印纸大小不同进行打印呢)?
 
TPrinter.Canvas.CopyRect(DestRect, Bitmap.Canvas, Bitmap.Canvas.ClipRect)
只要两个Rect是相似的,就可以保证不失比例。
 
如果你每次都要打满一个page,
DestRect:=rect(0,0,printer.pagewidth-1,printer.pageheight-1);
但因为象素为单位,这样做似乎不能满足你的按比例缩放,可以先获得打印设备的分辨率
(每英寸的象素数)
pixelsperinchx:=getdevicecaps(printer.canvas.handle,LOGPIXELSX);
pixelsperinchy:=getdevicecaps(printer.canvas.handle,LOGPIXELSY);
然后按照这个分辨率对你打印的图象缩放即可
 
那绘完图应该如何将所画的图形送到打印机上呢?
比如,我画了一条直线,并将直线的参数保存在一个文件中。这时应该怎样实现打印呢?
谢谢

 
用 SetMapMode、SetWindowExtEx、SetViewPortExtEx 设置映射模式和比例,向 Printer.Canvas
上画。
保存到文件可以考虑图元文件(EMF、WMF)。
 
noall:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
我用timage.canvas做画布,timage宽度和高度给于一定的值。那在打印时该怎么办啊?
比如image的宽度和高度是1000,那在纸张上应该在多大的区域呢?
请给个例子。谢谢各位了
 
下面代码可以实现根据打印纸大小不同打印Image1.Canvas,
可以自动匹配打印纸的大小进行拉伸打印:
procedure TFormImageProcess.BtnPrintClick(Sender: TObject);
begin
if Printer.Printers.Count>0 then if PrinterSetupDialog1.Execute then
if PrintDialog1.Execute then with Printer do begin
Copies:=1; Title:='图像打印';
BeginDoc;
Canvas.CopyRect(Rect(100, 100,PageWidth-100,PageHeight-100), Image1.Canvas,
Rect(0, 0,Image1.Width-1,Image1.Height-1));
EndDoc;
end
end;
 
用DIB吧
如下:
var
FormImage: TBitmap;
Info: PBitmapInfo;
InfoSize: DWORD;
Image: Pointer;
ImageSize: DWORD;
Bits: HBITMAP;
DIBWidth, DIBHeight: Longint;
PrintWidth, PrintHeight: Longint;
begin
Printer.BeginDoc;
try
FormImage := GetFormImage;
Canvas.Lock;
try
{ Paint bitmap to the printer }
with Printer, Canvas do
begin
Bits := FormImage.Handle;
GetDIBSizes(Bits, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
try
Image := AllocMem(ImageSize);
try
GetDIB(Bits, 0, Info^, Image^);
with Info^.bmiHeader do
begin
DIBWidth := biWidth;
DIBHeight := biHeight;
end;
case PrintScale of
poProportional:
begin
PrintWidth := MulDiv(DIBWidth, GetDeviceCaps(Handle,
LOGPIXELSX), PixelsPerInch);
PrintHeight := MulDiv(DIBHeight, GetDeviceCaps(Handle,
LOGPIXELSY), PixelsPerInch);
end;
poPrintToFit:
begin
PrintWidth := MulDiv(DIBWidth, PageHeight, DIBHeight);
if PrintWidth < PageWidth then
PrintHeight := PageHeight
else
begin
PrintWidth := PageWidth;
PrintHeight := MulDiv(DIBHeight, PageWidth, DIBWidth);
end;
end;
else
PrintWidth := DIBWidth;
PrintHeight := DIBHeight;
end;
StretchDIBits(Canvas.Handle, 0, 0, PrintWidth, PrintHeight, 0, 0,
DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
end;
finally
Canvas.Unlock;
FormImage.Free;
end;
finally
Printer.EndDoc;
end;
end;
 
我写了一段程序可以把Image自动缩放并打印在纸张中间。

Ratio1 := Printer.PageWidth / Image.Width; //Ratio1: Double
Ratio2 := Printer.PageHeight / Image.Height; //Ratio2: Double
if Ratio1 < Ratio2 then Ratio := Ratio1 //Ratio: Double
else Ratio := Ratio2;
Wid := Round(Ratio * Image.Width); //Wid: Integer
Hei := Round(Ratio * Image.Height); //Hei: Integer
X := (Printer.PageWidth - Wid) shr 1; //X: Integer
Y := (Printer.PageHeight - Hei) shr 1; //Y: Integer
DestRect := Rect(X, Y, X + Wid, Y + Hei); //DestRect: TRect
Printer.Canvas.Draw(DestRect, Image.Canvas, Image.ClientRect);
 
后退
顶部