- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 BitBlt 将 Printer.Canvas 捕获为位图。然后我想获取该位图并将其显示在油漆盒上。然而,当我尝试这样做时,我只得到一个与我为 Bitmap.SetSize 输入的值成比例的白色矩形。我的打印输出看起来正确,所以我几乎肯定打印机的 Canvas 已正确绘制。我尝试使用变量位图作为目标和绘画框作为源来编写以下代码(本质上,我正在将一个简单的矩形和文本行绘制到绘画框,将其位 block 转换为位图,清除它,然后将其发布回到颜料盒),但现在 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;
我希望 Canvas 也能被写入, Canvas 将被复制到位图,然后可以在油漆盒上绘制。然而我看到的只是一个白色的矩形。我将位图的尺寸设置为整个颜料盒而不是打印机的整个 Canvas 。我这样做是因为如果我理解正确的话,我应该只在打印机 Canvas 的 TopLeft 0,0 和 BottomRight 300,300 之间进行绘制,就像在我的油漆盒上一样。我希望看到与直接在 Paintbox 中执行此操作相同的结果。
任何帮助将不胜感激。提前致谢。
鉴于我收到的评论,我想做的事情似乎是不可能的。我想做的是写入打印机 Canvas ,然后获取该 Canvas 的图像数据并将其存储在位图中。既然 BitBlt 不能使用,有没有办法做我想做的事?我认为不是,因为我被告知 Printer.Canvas 无法读取。此时我已经找到了解决方法,但我只是好奇。
最佳答案
切换你的逻辑...绘制到 PaintBox...并打印 PaintBox
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;
关于delphi - BitBlt Printer.Canvas 到 TBitMap 显示为纯白色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816270/
我正在使用下面的代码使用 bltblt 捕获窗口的屏幕截图。但是,标题栏在捕获的屏幕截图中显示为完全黑色。我在 Windows 8.1 上运行代码。有没有一种方法可以正确捕获标题栏。 // Retri
我有一个将多页 tiff 拆分为单页的函数,它使用 Windows BitBlt 函数。在性能方面,显卡对拆分有影响吗?是否值得直接使用 C/C++ 库? 最佳答案 显卡不会参与任何事件,除非它是 B
我正在尝试编写一个程序,当勾选一个复选框时,它会在屏幕的大面积区域显示一个网格。我正在尝试使用 BitBlt 在 WM_PAINT 中执行此操作,并且我的显示函数肯定是使用正确的 bool 值调用的。
我正在使用 MFC,我正在尝试将图像绘制到屏幕上。我有以下 OnDraw 函数: void CgraphicstestView::OnDraw(CDC* pDC) { CgraphicstestDo
我正在将剪贴板中的图像粘贴到我的程序中。位图被放置在背景 memDC 位图上,然后在绘制到屏幕之前与另一个 memDC 合成。背景位图是每像素 8 位。问题是 bitblt 将 Black(0x000
我正在使用 BitBlt 在我的按钮上显示位图。对于大多数情况,它很好,但是存在内存泄漏,导致程序在一段时间后崩溃。我做错了什么? int Springboard::DrawBasicButtons(
我正在为一个简单的 Direct3D 游戏制作闪屏,尽管屏幕本身已正确创建和销毁,但未显示要投影到闪屏上的 BITMAP。到目前为止我有这个: //variable declarations HWND
我有一个 MFC 控件,我将一个句柄传递给一个位图 (HBITMAP)。在控件 OnPaint 方法中,我使用 BitBlt 来呈现位图。但是位图被颠倒了。 作为测试,我从这个句柄创建了一个 CBit
我正在尝试在 Windows 10 下使用 GDI 捕获屏幕的正方形部分。这就是我尝试的方式: //Get screen DC desktop = GetDC(NULL); //Create a co
我想在现有引擎中创建裁剪功能。这是我已经拥有的: bool Bitmap::Crop(RECT cropArea) { BITMAP bm; GetObject(m_Handle, sizeof(bm
我正在尝试使用此代码将 Bitmap 直接绘制到 PictureBox 上: Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\Users\Ken\Desktop\L
我正在尝试绘制到屏幕外设备上下文/位图,并使用 bitblt 将图像移动到主 hdc。这是我目前看到的结果: 左边的蓝色、黄色和绿色条被直接绘制到窗口的 hdc。右边看起来很奇怪的那些被绘制到后台缓冲
我想创建一个幻灯片效果:在窗体的 Canvas 上从右到左绘制一个位图。为此,我使用 BitBlt。 我在定时器(20 毫秒)中调用此函数: var ViewPort: TRect; ViewPort
您好我试图捕获屏幕截图,但图像出来损坏,任何人都可以看到代码有什么问题,基本上我试图使用createdibsection以便我可以直接访问这些位。 这就是结果图片 http://oi47.tinypi
将一个 QImage 复制到 Qt4 中特定位置的另一个 QImage 的推荐方法是什么? QImage::bitblt 在 Qt4 中被删除。 QImage 现在需要转换为 PixMap 并返回吗?
我在这个程序中使用 BitBlt 时遇到问题。您调整窗口大小,椭圆也会随之调整大小。当然,用普通的hdc方法,是断断续续的。我尝试了 BitBlt 方法,但这也不起作用(可能是因为我做错了)。有人可以
这是我目前正在做的: 通过GetWindowDC获取窗口DC 使用 CreateCompatibleDC 创建一个兼容的 DC 在我的兼容 DC 上调用 GetPixel 不幸的是,我所有的 GetP
现在我正在使用 GetPixel() 从桌面检索大约 64 个像素以获得它们的颜色。我读到有关 GetPixel() 的信息很慢,但我认为这对几个像素并不重要,但每次我运行例程都需要 1.5 秒。在做
我编写了以下代码 (C++ Win32) 来捕获游戏窗口屏幕并从图像中获取像素颜色数组。函数 autoB() 完成这项工作。 然后我将结果数组绘制到我的窗口中以直观地检查我得到了什么。 问题是这个程序
我目前正在使用 Petzold 的书(第 5 版)回到一些 Windows 编程。我编译了following example使用 BitBlt 但它无法正常工作。 它应该复制 (CxSource, C
我是一名优秀的程序员,十分优秀!