Delphi 位图的画布显示为纯白
我正在尝试使用BitBlt将Printer.Canvas捕获为位图。然后我想把位图显示在画框上。但是,当我尝试此操作时,只会得到一个与我为Bitmap.SetSize输入的值成比例的白色矩形。我的打印输出看起来是正确的,所以我几乎可以肯定打印机的画布正在正确绘制。我尝试使用变量bitmap作为目标,paintbox作为源代码(本质上,我是在paintbox中绘制一个简单的矩形和一行文本,将其位图,清除它,然后将其发回paintbox),但现在Printer.Canvas.Handle是源代码,它没有显示 我知道屏幕和打印机之间的尺寸不同,所以我会清楚地指出尺寸,以防万一我做错了Delphi 位图的画布显示为纯白,delphi,printing,bitblt,Delphi,Printing,Bitblt,我正在尝试使用BitBlt将Printer.Canvas捕获为位图。然后我想把位图显示在画框上。但是,当我尝试此操作时,只会得到一个与我为Bitmap.SetSize输入的值成比例的白色矩形。我的打印输出看起来是正确的,所以我几乎可以肯定打印机的画布正在正确绘制。我尝试使用变量bitmap作为目标,paintbox作为源代码(本质上,我是在paintbox中绘制一个简单的矩形和一行文本,将其位图,清除它,然后将其发回paintbox),但现在Printer.Canvas.Handle是源代码,它
procedure TForm2.btnDrawClick(Sender: TObject);
begin
Printer.BeginDoc;
Printer.Canvas.Font.Size := 10; //Not Sure if this is necessary
Printer.Canvas.Font.Name := 'Arial'; //Not Sure if this is necessary
Printer.Canvas.Font.Color := clBlack; //Not Sure if this is necessary
Printer.Canvas.Rectangle(100,100,200,200); //Should print very tiny to paper
//But will look bigger when posted to
//The Paintbox
Printer.Canvas.TextOut(120,120,'XRay-Cat');
PCBitmap.SetSize(Paintbox1.Width,Paintbox1.Height); //Paint box is 300W,300H
Application.ProcessMessages;
BitBlt(PCBitmap.Canvas.Handle, //PCBitmap, is created on create, freed on destroy,
//Defined in the private section
0,
0,
PCBitmap.Width, //300
PCBitmap.Height, //300
Printer.Canvas.Handle,
0,
0,
SRCCOPY);
Application.ProcessMessages;
Printer.EndDoc;
procedure TForm2.btnPostBMClick(Sender: TObject);
begin
PaintBox1.Canvas.Draw(0,0,PCBitmap);
end;
我希望画布也会被写入,画布会被复制成位图,然后可以在画框上绘制。然而,我看到的只是一个白色的长方形。我将位图的尺寸设置为整个颜料盒,而不是打印机的整个画布。我这样做是因为如果我理解正确,我应该只在打印机画布的左上角0,0和右下角300300之间绘制,就像我在画框上绘制一样。我希望看到的结果与我直接对喷漆盒进行此操作时看到的结果相同
任何帮助都将不胜感激。提前谢谢
考虑到我收到的评论,我想做的似乎是不可能的。我想做的是写入打印机画布,然后获取画布的图像数据并将其存储在位图中。既然BitBlt不能使用,有没有办法实现我的愿望?我想不会的,就像打印机告诉我的那样。画布不能从中读取。在这一点上,我找到了一种解决方法,但我只是好奇。切换您的逻辑…绘制到油漆盒…并打印油漆盒
procedure TForm55.Button1Click(Sender: TObject);
var
a_BM: TBitMap;
begin
a_BM := TBitmap.Create;
try
PaintBox1.Canvas.Font.Size := 10; //Not Sure if this is necessary
PaintBox1.Canvas.Font.Name := 'Arial'; //Not Sure if this is necessary
PaintBox1.Canvas.Font.Color := clBlack; //Not Sure if this is necessary
PaintBox1.Canvas.Rectangle(0,0,300,300); //Should print very tiny to paper
//But will look bigger when posted to
//The Paintbox
PaintBox1.Canvas.TextOut(120,120,'XRay-Cat');
PaintBox1.Width := 300;
PaintBox1.Height := 300;
a_BM.SetSize(PaintBox1.Width, PaintBox1.Height);
BitBlt(a_BM.Canvas.Handle, 0, 0, a_BM.Width, a_BM.Height, PaintBox1.Canvas.Handle, 0, 0, SRCCOPY);
Application.ProcessMessages;
Printer.BeginDoc;
Printer.Canvas.Draw(a_BM.Canvas.ClipRect.Left, a_BM.Canvas.ClipRect.Top, a_BM);
Printer.EndDoc;
Application.ProcessMessages;
finally
a_BM.Free;
end;
end;
你不能使用BitBlt…你需要使用DIB…看看GetDIBits、SetDIBits和StretchDibits你能解释为什么吗?我很想了解为什么Printers.Canvas.Handle与Paintbox.Canvas.Handle不同(除了明显的区别)。感谢您的回复,我将对此进行调查。您无法从打印机读取内容的原因与无法向扫描仪或麦克风写入内容的原因相同。这是有道理的。谢谢你的解释。鉴于我收到的评论,我想做的似乎是不可能的。我想做的是写入打印机画布,然后获取画布的图像数据并将其存储在位图中。既然BitBlt不能使用,有没有办法实现我的愿望?我想不会的,就像打印机告诉我的那样。画布不能从中读取。在这一点上,我已经找到了一个解决办法,但我只是好奇,这也不是很聪明。假设您以300 dpi打印到PDF文件,然后将此PDF打印到600 dpi的打印机。重新采样的结果很可能很难看。此外,PDF中有一个大位图,PDF文件很大,就像是扫描一样。在我看来,没有通用的方法来解决这个问题,你必须尽可能在没有透明度的情况下打印矢量图形和图像。或者从打印机画布上复制,希望返回有效数据。一些PDF打印机返回有效数据。他不是要求打印PDF…他是在问如何在打印机上进行BitBlt,并想知道为什么它不起作用。所以我展示了如何让BitBlt与他正在使用的颜料盒和打印机一起工作。不,他问的是如何从打印机画布上进行BitBlt。我没有回答他的问题,但评论了你的回答。因为在这种特殊情况下,这可能会解决他的问题,但总的来说,这不是一个好的解决方案。出于某种原因,他想打印一些东西(打印机可以是pdf打印机),我来这里是因为我有类似的问题。