OVH Cloud OVH Cloud

DrawDibDraw equivalent C#

2 réponses
Avatar
Aurel
Bonjour,

je recois une image d'une caméra en tableau de byte[].
Je souhaite travailler en C# du coup je traduis un peu les sources de monSDK
fourni en C++.

Il s'avère que lorsque je veux charger ce tableau comme ceci
et bien j'ai une erreur "Parameter is not valid"
Alors qu'a ce stade la, en C++ ils arrivent a afficher sans problèmes cette
image avec DrawDibDraw.

Ma question est: "Il y a t'il une équivalence pour dessiner directement?" ou
alors "Ou est la différence entre ces 2 méthodes ? Serait ce mon Image qui
ne supporte pas certaines données que DrawDibDraw accepte...?"

Enfin si qqn a compris et souhaite m'aider qu'il me fasse signe.

Merci

A+

Aurel

2 réponses

Avatar
Remi THOMAS
"Aurel" écrivit
Bonjour,

je recois une image d'une caméra en tableau de byte[].
Je souhaite travailler en C# du coup je traduis un peu les sources de
monSDK fourni en C++.

Il s'avère que lorsque je veux charger ce tableau comme ceci
et bien j'ai une erreur "Parameter is not valid"
Alors qu'a ce stade la, en C++ ils arrivent a afficher sans problèmes
cette image avec DrawDibDraw.

Ma question est: "Il y a t'il une équivalence pour dessiner directement?"
ou alors "Ou est la différence entre ces 2 méthodes ? Serait ce mon Image
qui ne supporte pas certaines données que DrawDibDraw accepte...?"

Enfin si qqn a compris et souhaite m'aider qu'il me fasse signe.

Merci

A+

Aurel



Bonjour,
Je viens de sacrifier un poulet pour lire dans ses entrailles, mais rien, le
néant, je n'arrive pas à retrouver une seule ligne de code de ton projet.

4 lignes de code peuvent nous aider à comprendre ton problème.

Rémi
Avatar
Aurel
Effectivement, Dieu bénisse ton poulet...
Bon alors au niveau du code C++ que j'essaie de recréer, ca donne

void CDemoDlg::OnGetImage()
{
DWORD dwLength;

m_status.Format("Run Get Image");
UpdateData(FALSE);

if(SRVP_FindDevice())
{
if(SRVP_GetImage(pBuf,&dwLength)) //pBuf est le pointeur byte* qui
recupere les info
{

Y422RGB24(pBuf,RgbBuf); //Fonction qui transforme le signal YUV422 en
RGB 24 bits, pBuf devient rgbBuf

if (dwLength==IMG_WIDTH*IMG_HEIGHT*2) {
bShowBuffer = TRUE;
Invalidate(FALSE);
SaveImage(0,0);
}
else bShowBuffer = FALSE;
}
else
{
m_status.Format("Not support in preview mode");
UpdateData(FALSE);
}

}
else
{
m_status.Format("Camera Not Connected");
UpdateData(FALSE);
}
}

Une fois que rgbBuf est initialisé (après Y422RGB24, il sera dessiné par
DrawDibDraw dans l'evenement OnPaint

// Initialisation de BitmapInfo header dans OnInitDialog
m_bitmapinfo.biSize = sizeof(BITMAPINFOHEADER);
m_bitmapinfo.biPlanes = 1;
m_bitmapinfo.biBitCount = 24;
m_bitmapinfo.biCompression = BI_RGB;
m_bitmapinfo.biXPelsPerMeter = 0;
m_bitmapinfo.biYPelsPerMeter = 0;
m_bitmapinfo.biClrUsed = 0;
m_bitmapinfo.biClrImportant = 0;

// Création de DrawDibDraw dans OnCreate
LPVOID pParam=this;
DWORD dwThreadId;
m_bActive = TRUE;
fPreview = FALSE;

pBuf=(BYTE *) malloc(1024*768*2);

if(!m_dibDC)
{
m_dibDC = DrawDibOpen();
DrawDibStart(m_dibDC, MulDiv(30,1,1000));
}
// default drawing setting
imageWidth = 1024;
imageHeight = 768;
m_nOldWidth = imageWidth;
m_bitmapinfo.biWidth = imageWidth;
m_bitmapinfo.biHeight = imageHeight;
m_bitmapinfo.biSizeImage = imageWidth * imageHeight * 3;
if(m_dibDC)
DrawDibBegin(m_dibDC, // handle to DrawDib context
NULL, // hdc for the picture
imageWidth, // image width
imageHeight, // image height
&m_bitmapinfo, // pointer to a BITMAPINFOHEADER
imageWidth, // source width
imageHeight, // source height
DDF_ANIMATE); // animate the palette

// Puis dans OnPaint, on peint...
LPVOID pParam=this;
DWORD dwThreadId;
m_bActive = TRUE;
fPreview = FALSE;

pBuf=(BYTE *) malloc(1024*768*2);

if(!m_dibDC)
{
m_dibDC = DrawDibOpen();
DrawDibStart(m_dibDC, MulDiv(30,1,1000));
}
// default drawing setting
imageWidth = 1024;
imageHeight = 768;
m_nOldWidth = imageWidth;
m_bitmapinfo.biWidth = imageWidth;
m_bitmapinfo.biHeight = imageHeight;
m_bitmapinfo.biSizeImage = imageWidth * imageHeight * 3;
if(m_dibDC)
DrawDibBegin(m_dibDC, // handle to DrawDib context
NULL, // hdc for the picture
imageWidth, // image width
imageHeight, // image height
&m_bitmapinfo, // pointer to a BITMAPINFOHEADER
imageWidth, // source width
imageHeight, // source height
DDF_ANIMATE); // animate the palette

Voila pour le code C++, je charge ma dll et la fonction GetImage en C#
comme suit
C++ -> SRVP_API BOOL SRVP_GetImage(BYTE *pBuf, DWORD *pLength);
C#
[DllImport("SRVP.dll",EntryPoint="..."]
public static extern unsafe bool SRVP_GetImage(byte *pBuf, UInt32 *pLength);

et dans mon code tout simplement.
uint dwLength = 0;
byte[] Buf = new Byte[1024*768*2];
byte[] rgbBuf = new Byte[1024*768*3]
fixed(byte* pBuf = Buf){
if(maClasseDll.SRVP_GetImage(pBuf,&dwLength)){
fixed(byte* pRgbBuf = rgbBuf){
maClassedeFonctionsCompiléduC++.Y422RGB24(pBuf,pRgbBuf);
using(MemoryStream ms = new MemoryStream(rgbBuf,0,rgbBuf.Length){
ms.Write(rgbBuf,0,rgbBuf.Length);
Image newImage = Image.FromStream(ms);
// Et la ca plante "Parameter is not valid"
}
}
}
}

Voila il y a tout, je pense.
J'ai du utiliser les pointeurs en unsafe en C# car avec ref ou out, ca ne
marchait pas, je n'obtenai pas de réponse de ma fonction.
Pas d'exception, mais pas de réponse, l'application etait bloquée.

Merci pour tout ces poulets morts...
Si qqn a une tite idée.

Merci

Aurel


----- Original Message -----
From: "Remi THOMAS"
Newsgroups: microsoft.public.fr.dotnet.csharp
Sent: Friday, December 22, 2006 7:23 AM
Subject: Re: DrawDibDraw equivalent C#


"Aurel" écrivit
Bonjour,

je recois une image d'une caméra en tableau de byte[].
Je souhaite travailler en C# du coup je traduis un peu les sources de
monSDK fourni en C++.

Il s'avère que lorsque je veux charger ce tableau comme ceci
et bien j'ai une erreur "Parameter is not valid"
Alors qu'a ce stade la, en C++ ils arrivent a afficher sans problèmes
cette image avec DrawDibDraw.

Ma question est: "Il y a t'il une équivalence pour dessiner directement?"
ou alors "Ou est la différence entre ces 2 méthodes ? Serait ce mon Image
qui ne supporte pas certaines données que DrawDibDraw accepte...?"

Enfin si qqn a compris et souhaite m'aider qu'il me fasse signe.

Merci

A+

Aurel



Bonjour,
Je viens de sacrifier un poulet pour lire dans ses entrailles, mais rien,
le néant, je n'arrive pas à retrouver une seule ligne de code de ton
projet.

4 lignes de code peuvent nous aider à comprendre ton problème.

Rémi


"Remi THOMAS" a écrit dans le message de news:
OwF%
"Aurel" écrivit
Bonjour,

je recois une image d'une caméra en tableau de byte[].
Je souhaite travailler en C# du coup je traduis un peu les sources de
monSDK fourni en C++.

Il s'avère que lorsque je veux charger ce tableau comme ceci
et bien j'ai une erreur "Parameter is not valid"
Alors qu'a ce stade la, en C++ ils arrivent a afficher sans problèmes
cette image avec DrawDibDraw.

Ma question est: "Il y a t'il une équivalence pour dessiner directement?"
ou alors "Ou est la différence entre ces 2 méthodes ? Serait ce mon Image
qui ne supporte pas certaines données que DrawDibDraw accepte...?"

Enfin si qqn a compris et souhaite m'aider qu'il me fasse signe.

Merci

A+

Aurel



Bonjour,
Je viens de sacrifier un poulet pour lire dans ses entrailles, mais rien,
le néant, je n'arrive pas à retrouver une seule ligne de code de ton
projet.

4 lignes de code peuvent nous aider à comprendre ton problème.

Rémi