(.net) pictureBox показва изображение от RAM

Трябва да покажа изображение от RAM в 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 на HDD може да се отвори с помощта на всяка програма за редактиране на изображения. Аз съм сравнително нов в c++ и не мога да накарам предложението за създаване на bitmal от файл да работи: 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, но няма да се актуализира, ако натисна бутона. Въпреки това, запазването на изображението и след това четенето му от HDD не е това, което търся тук, защото не искам да запазвам всяко изображение, преди да мога да го видя (програмата ще работи със стотици изображения в RAM)   -  person mTORjaeger    schedule 15.05.2014


Отговори (1)


От MSDN тема Bitmap Constructor (Int32, Int32, Int32, PixelFormat, IntPtr):

Повикващият е отговорен за разпределянето и освобождаването на блока памет, определен от параметъра scan0. Обаче паметта не трябва да се освобождава, докато не бъде освободено свързаното растерно изображение.

Във вашия случай освобождавате 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