【发布时间】:2014-07-28 07:05:50
【问题描述】:
我想我不太了解图形对象在 Visual C++ 2010 Express 中的工作原理。
我正在从网络摄像头中抓取一个框架,并在其上画一个圆圈。它在屏幕上效果很好。我只是创建一个 Graphics 对象,绘制图像,然后绘制椭圆。
在pictureBox_paint函数中,我有
Graphics^ g = e->Graphics; // from the camera
System::Drawing::Rectangle destRect = System::Drawing::Rectangle(0,0,pbCameraMonitor->Size.Width,pbCameraMonitor->Size.Height);
double slitHeightToWidth = 3;
g->DrawImage(this->currentCamImage,destRect);
int circleX, circleY;
circleX = (int) (pbCameraMonitor->Size.Width - radius/slitHeightToWidth)/2;
circleY = (int) (pbCameraMonitor->Size.Height - radius)/2;
g->DrawEllipse(Pens::Red, circleX, circleY, (int) radius/slitHeightToWidth, (int) radius);
到目前为止一切顺利,我的椭圆画得很好。 destRect 位确保它被缩放到图片框的大小。每次相机报告新图像时,我都会使图片框无效,并且我有视频。
现在,单击按钮,我想保存这张图片,上面有红色椭圆。但是,我不希望屏幕上显示重新缩放的版本,我想要完整的 res 版本。因此,我将另一个帧抓取到一个名为“grabbedFrame”的位图^ 中并执行以下操作:
String ^photofile = "Image_" + expRecord.timestamp.ToString("s") + ".jpg"; // get a unique filename
photofile = photofile->Replace(':', '_');
Graphics^ g = Graphics::FromImage(grabbedFrame);
g->DrawEllipse(Pens::Red, 20, 20, 20, 20); // circle size fixed just for demo
grabbedFrame->Save(photofile, System::Drawing::Imaging::ImageFormat::Jpeg);
当我这样做时,我会保存没有红色圆圈的图像。
g->DrawEllipse 真的会修改位图吗?还是只包含位图+绘图说明?如果是后者,pictureBox怎么知道Bitmap被修改了?如果是前者,为什么我的存档不包含修改?
如何保存修改后的位图?
【问题讨论】:
-
您的问题标题不准确。应该提到它与 Visual C++ 2010 Express 中的 Graphics 对象有关。
标签: image visual-c++ graphics bitmap c++-cli