【问题标题】:Drawing on image and saving在图像上绘图并保存
【发布时间】: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


【解决方案1】:

您需要将加载的图像绘制到一个新的Bitmap 中,对该位图进行修改,然后保存。

类似(伪代码):

// create bitmap and get its graphics
Bitmap^ pBmp = gcnew Bitmap(grabbedFrame->Width, grabbedFrame->Height);
Graphics^ g = Graphics::FromImage(pBmp);

// draw grabbed frame into bitmap
g->DrawImage(grabbedFrame, 0, 0, grabbedFrame->Width, grabbedFrame->Height);

// draw other stuff
g->DrawEllipse(Pens::Red, 20, 20, 20, 20);

// save the result
pBmp->Save(photofile, System::Drawing::Imaging::ImageFormat::Jpeg);

【讨论】:

  • 啊。我之前尝试过,但人为错误使它看起来不起作用。最后,成功!不过,我仍然很困惑。位图不是位图吗?为什么我必须做一个不同的?感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多