(.net) pictureBox показывает изображение из оперативной памяти

Мне нужно показать изображение из ОЗУ в pictureBox. Я трачу весь свой вчерашний день, чтобы попытаться заставить его работать. Вот небольшой код, чтобы показать вам, как я сейчас пытаюсь это сделать, но не могу заставить работать System::Drawing::Bitmap. Все, что я получаю, это пустой pictureBox. Я также записываю файл 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);

person mTORjaeger    schedule 15.05.2014    source источник
comment
Я думаю, что параметр шага должен быть 100*sizeof(unsigned char)*3   -  person Alex F    schedule 15.05.2014
comment
Для проверки создайте Bitmap из файла test.bmp, что у вас получилось?   -  person Alex F    schedule 15.05.2014
comment
Параметр шага был скорректирован, но в pictureBox по-прежнему не отображалось изображение. Файл bmd на жестком диске можно открыть с помощью любой программы для редактирования изображений. Я относительно новичок в С++, и я не могу заставить работать предложение по созданию битового изображения из файла: System::Drawing::Bitmap ^fromFile = gcnew System::Drawing::Image::FromFile(test.bmp); Я получаю ожидаемый идентификатор типа   -  person mTORjaeger    schedule 15.05.2014
comment
Не используйте для этого gcnew; System::Drawing::Image::FromFile — это статическая функция, а не тип.   -  person Rook    schedule 15.05.2014
comment
Код, который я показал выше, является частью события нажатия кнопки, что означает, что при каждом нажатии кнопки генерируется новое изображение. Если я загружаю изображение с помощью System::Drawing::Image ^fromFile = System::Drawing::Bitmap::FromFile(test.bmp); он правильно отображается в pictureBox, но не будет обновляться, если я нажму кнопку. Однако сохранение изображения, а затем чтение его с жесткого диска - это не то, что я ищу здесь, потому что я не хочу сохранять каждое изображение, прежде чем смогу его просмотреть (программа будет работать с сотнями изображений в ОЗУ)   -  person mTORjaeger    schedule 15.05.2014


Ответы (1)


Из темы MSDN Bitmap Constructor (Int32, Int32, Int32, PixelFormat, IntPtr):

Вызывающий объект отвечает за выделение и освобождение блока памяти, указанного параметром scan0. Однако память не должна освобождаться до тех пор, пока не будет освобожден соответствующий Bitmap.

В вашем случае вы освобождаете массив imgData сразу после создания Bitmap. Держите этот массив постоянным все время, пока Bitmap жив, в соответствии с требованиями конструктора.

person Alex F    schedule 15.05.2014
comment
спасибо большое что починили! Как мне снова освободить память? Если я сделаю это в событии button_click, то изображение больше не будет отображаться, но я не могу освободить его снаружи, потому что я объявил точки imgdata внутри события. - person mTORjaeger; 15.05.2014
comment
Хорошо, объявите imgdata вне функции, как член класса. - person Alex F; 15.05.2014