c++有效地在背景图像上绘制线条
c++ efficiently draw line over background image
TBitmap* prevImg
对象需要一些时间来生成,所以我只生成一次,并希望将其设置为背景:
Image1->Picture->Assign(prevImg); //TImage* Image1
现在我想在鼠标上画一些线和数字,移动到上面:
void __fastcall TTriggerSystemForm::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y){
if(!prevImg)return;
Image1->Picture->Assign(prevImg); //reset image
Image1->Canvas->Pen->Color=clRed; //draw a vertical dotted red line
Image1->Canvas->Pen->Style=psDot;
Image1->Canvas->MoveTo(X,0);
Image1->Canvas->LineTo(X,Image1->Picture->Height);
}
现在这个工作已经很好了。但是,由于图像有时会闪烁,并且任务的CPU占用率高达8%,因此这可能不是很有效。
我正在使用c++ Builder XE2与VCL。
是否有更好的方法在给定的TImage对象上动态地绘制一些东西而不改变原始图像源?
阅读双缓冲,诀窍是你在不同的缓冲区上绘图,一旦你的工作完成,你切换缓冲区。这将防止'闪烁'。
要降低CPU使用率,您可以最小化处理的鼠标事件的数量,例如,如果距离最后处理的事件的时间低于100-200ms,则跳过事件的处理
您可以简单地绘制图像中实际发生变化的部分,而不是绘制整个图像,例如:
int oldX = -1;
void __fastcall TTriggerSystemForm::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
if (!prevImg) return;
if (!Image1->Picture->Graphic)
Image1->Picture->Assign(prevImg); //reset image
if (oldX == X) return;
if (oldX != -1)
{
TRect r = Rect(oldX, 0, oldX + Image1->Canvas->Pen->Width, Image1->Height);
Image1->Canvas->CopyRect(r, prevImg->Canvas, r);
}
Image1->Canvas->Pen->Color = clRed; //draw a vertical dotted red line
Image1->Canvas->Pen->Style = psDot;
Image1->Canvas->MoveTo(X, 0);
Image1->Canvas->LineTo(X, Image1->Height);
oldX = X;
}
话虽如此,我建议使用TPaintBox
而不是TImage
,例如:
int MouseX = -1;
void __fastcall TTriggerSystemForm::PaintBox1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
MouseX = X;
PaintBox1->Invalidate();
}
void __fastcall TTriggerSystemForm::PaintBox1MouseMove(TObject *Sender)
{
if (!prevImg) return;
PaintBox1->Canvas->Draw(0, 0, prevImg); //reset image
if (MouseX != -1)
{
PaintBox1->Canvas->Pen->Color = clRed; //draw a vertical dotted red line
PaintBox1->Canvas->Pen->Style = psDot;
PaintBox1->Canvas->MoveTo(MouseX, 0);
PaintBox1->Canvas->LineTo(MouseX, PaintBox1->Height);
}
}
相关文章:
- 如何在 direct2d 中使用随其窗口重新缩放的效果绘制图像
- 如何在圆圈内绘制图像
- SDL 不绘制图像
- 如何使用QGraphicsItem绘制图像?
- 使用图像指针绘制图像
- 如何在圆角矩形或圆形内部绘制图像
- 在屏幕上绘制图像后背景发生变化
- 在 Allegro5 中绘制图像/字体的一部分
- C++ WinApi 绘制图像.jpg到新窗口
- 无法从 Direct2D png 使用 DirectX9 绘制图像精灵
- 在中心绘制图像,同时保持纵横比
- 如何在MFC对话框的静态区域中绘制图像
- c++在位图上绘制图像并保存
- 在 Direct2D 中绘制图像的一部分
- wxWidgets:定期在wxFrame中重新绘制图像
- 绘制图像的功能
- 在图片控件中绘制图像
- 你如何从矢量<CvPoints>或矢量绘制图像<Point2f>?
- Visual C++如何使用CPaintDC、CDC在CView中重新绘制图像
- OpenGL绘制图像.PIC库