Image aus Speicher erstellen



  • Hi

    ich benutze C++/CLI,
    und eine ActiveX-Komponente von Axis zum Anzeigen und Steuern von VideoStrömen aus einer Netzwerkkamera.

    Diese beinhaltet auch eine Funktion

    GetCurrentImage(format,System::Object^ %buffer,int%buffersize)
    

    Diese liefert laut Docu einen Speicherbereich, welcher am Anfang eine BITMAPINFOHEADER Struktur hat, und direkt danach die Bilddaten im RGB24 Format.

    Aufruf der Funktion klappt, auch die zurückgelieferte buffersize paßt.

    (Width*Height*3+sizeof(BITMAPINFOHEADER))=buffersize

    Habe ich in normalem C++ ausprobiert. 🙂

    Leider habe ich überhaupt keine Idee, wie ich aus dem System::Object jetzt ein System::Drawing::Bitmap machen kann.

    Oder wie ich zumindest direkt auf den Speicher zugreifen könnte, um die Pixelfarben selbst auszulesen und per Bitmap::LockBits in ein Bitmap zu schreiben.

    Folgende Code habe ich unter C++ ausprobiert:

    VARIANT myBuffer;
    	char myString[100];
    	long BufferSize;
    	m_AMC.GetCurrentImage(1,&myBuffer,&BufferSize);
    	BITMAPINFOHEADER t;
    	memcpy(&t,&myBuffer,sizeof(BITMAPINFOHEADER));
    	_ltoa_s(t.biWidth,myString,10);
    	MessageBox(myString);
    

    Leider steht in myString nur Speichermüll.

    Hoffe irgendjemand hat eine Idee, am besten in C++/CLI 🙂

    Mfg

    Reinhold Fischer



  • Hallo, habs jetzt selber gelöst.

    Falls es jemanden interessiert:

    System::Object^ buffer;	
    	int buffersize;
    	Drawing::Imaging::BitmapData^ myData;
    	m_AxisKameraHandle->GetCurrentImage(1,buffer,buffersize);
    	array<unsigned char>^ myBuffer=static_cast<array<unsigned char>^>(buffer);
    	m_Bitmap=gcnew Drawing::Bitmap(704,576,Drawing::Imaging::PixelFormat::Format24bppRgb);
    	myData=m_Bitmap->LockBits(Drawing::Rectangle(0,0,m_Bitmap->Width,m_Bitmap->Height),Drawing::Imaging::ImageLockMode::WriteOnly,Drawing::Imaging::PixelFormat::Format24bppRgb);
    	System::Runtime::InteropServices::Marshal::Copy(myBuffer,40,myData->Scan0,buffersize-40);
    	m_Bitmap->UnlockBits(myData);
    
    	return m_Bitmap;
    

Anmelden zum Antworten