【问题标题】:(.net) pictureBox show image from RAM(.net)pictureBox 显示来自 RAM 的图像
【发布时间】:2014-05-15 19:29:05
【问题描述】:

我需要在图片框中显示来自 RAM 的图像。我昨天花了一整天的时间来尝试让它工作。这里有一些代码向您展示我目前是如何尝试这样做的,但我无法让 System::Drawing::Bitmap 工作。我得到的只是一个空的图片框。 我还将一个 BMP 文件写入我的磁盘,并且该文件与预期的一样(灰度噪声)。如果您能帮助我,我将非常高兴!

unsigned char* imgData;
imgData = (unsigned char*)malloc(100 * 100 * sizeof(unsigned char)*3);
for (int i = 0; i < 100 * 100; i++){
     memset(imgData+ i*3,rand()%255, 3); //generates a random pixel vaoue between 0 and 255 and then assigns all three colors of a pixel to it
}
// this->textBox1->Text += "Values: " + *(imgData + 1) + " \r\n";
 const char* fname;
 fname = "test.bmp";
 write_bmp(fname, 100, 100, (char*)imgData); //writes 24-bit BMP File

 System::Drawing::Bitmap ^mybm = gcnew System::Drawing::Bitmap(
           100, 100, 100*sizeof(unsigned char)*3,
           System::Drawing::Imaging::PixelFormat::Format24bppRgb,
           (System::IntPtr) imgData);

 this->pictureBox1->Image = mybm;
 this->pictureBox1->Show();

 free(imgData);

【问题讨论】:

  • 我认为stride参数应该是100*sizeof(unsigned char)*3
  • 为了测试,从文件test.bmp创建Bitmap,你有什么结果?
  • stride参数已经调整,但是pictureBox仍然没有显示图像。可以使用任何图像编辑程序打开硬盘上的 bmd 文件。我对 c++ 比较陌生,我无法从文件建议中创建位元: System::Drawing::Bitmap ^fromFile = gcnew System::Drawing::Image::FromFile("test.bmp");我得到“预期的类型标识符”
  • 不要为此使用gcnewSystem::Drawing::Image::FromFile 是静态函数,不是类型。
  • 我上面显示的代码是按钮单击事件的一部分,这意味着每次按下按钮都会生成一个新图像。如果我使用 System::Drawing::Image ^fromFile = System::Drawing::Bitmap::FromFile("test.bmp"); 加载图像它正确显示在图片框中,但如果我按下按钮将不会更新。但是,保存图像然后从 HDD 读取它不是我在这里寻找的,因为我不想在能够查看之前保存每个图像(程序将处理 RAM 中的数百个图像)

标签: .net c++-cli picturebox


【解决方案1】:

来自 MSDN 主题Bitmap Constructor (Int32, Int32, Int32, PixelFormat, IntPtr)

调用者负责分配和释放由scan0参数指定的内存块。但是,在释放相关的 Bitmap 之前,不应释放内存。

在您的情况下,您在 Bitmap 创建后立即释放 imgData 数组。根据构造函数的要求,当Bitmap 活着时,保持这个数组一直保持不变。

【讨论】:

  • 非常感谢您修复了它!我应该如何再次释放内存?如果我在 button_click 事件中执行此操作,则不再显示图片,但我无法将其释放到外部,因为我在事件中声明了 imgdata 点
  • 好吧,在函数外声明imgdata,作为类成员。
猜你喜欢
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
相关资源
最近更新 更多