Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

C# --> VB.Net

4 réponses
Avatar
Alex
Bonjour,

J'ai un trouvé un bout de code fort interressant sur le web mais
malheuresement pour moi il est ne C#. Je ne suis pas allergique au C ou c# ,
encore moins étranger, mais certaines lacunes m'empêche de transcrire un
bout de code en VB .net
Habituellement la transcription ne me pose pas de problèmes. JE sais aussi
qu'il existe des moteur de transcription automatiques. Mais là je pense
savoir mais j'aimerais être sûr.

Ce bout de code permet de modifier le contraste d'une image bitmap :

public static bool Contrast(Bitmap b, sbyte nContrast)
{
if (nContrast < -100) return false;
if (nContrast > 100) return false;

double pixel = 0, contrast = (100.0+nContrast)/100.0;

contrast *= contrast;

int red, green, blue;

// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;

unsafe
{
byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;

for(int y=0;y<b.Height;++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];

pixel = red/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[2] = (byte) pixel;

pixel = green/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[1] = (byte) pixel;

pixel = blue/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;

p += 3;
}
p += nOffset;
}
}

b.UnlockBits(bmData);

return true;
}

La partie qui m'embête est celle ci :

byte * p = (byte *)(void *)Scan0;

je pense qu'il s'agit de pointeurs,ceux entres parentheses des cast de
pointeurs mais je n'en suis pas sur, et je n'arrive pas à bien le
retranscrire en VB.Net, une aide ne serait pas de refus !


Merci d'avance,

Alexandre.

4 réponses

Avatar
Gilles TOURREAU [MVP]
Le Wed, 09 Jan 2008 23:01:12 +0100, Alex a écrit:

Bonjour,

J'ai un trouvé un bout de code fort interressant sur le web mais
malheuresement pour moi il est ne C#. Je ne suis pas allergique au C ou
c# , encore moins étranger, mais certaines lacunes m'empêche de
transcrire un bout de code en VB .net
Habituellement la transcription ne me pose pas de problèmes. JE sais
aussi qu'il existe des moteur de transcription automatiques. Mais là je
pense savoir mais j'aimerais être sûr.

Ce bout de code permet de modifier le contraste d'une image bitmap :

public static bool Contrast(Bitmap b, sbyte nContrast)
{
if (nContrast < -100) return false;
if (nContrast > 100) return false;

double pixel = 0, contrast = (100.0+nContrast)/100.0;

contrast *= contrast;

int red, green, blue;

// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width,
b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;

unsafe
{
byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;

for(int y=0;y<b.Height;++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];

pixel = red/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[2] = (byte) pixel;

pixel = green/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[1] = (byte) pixel;

pixel = blue/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;

p += 3;
}
p += nOffset;
}
}

b.UnlockBits(bmData);

return true;
}

La partie qui m'embête est celle ci :

byte * p = (byte *)(void *)Scan0;

je pense qu'il s'agit de pointeurs,ceux entres parentheses des cast de
pointeurs mais je n'en suis pas sur, et je n'arrive pas à bien le
retranscrire en VB.Net, une aide ne serait pas de refus !


Merci d'avance,

Alexandre.





Bonjour,

Le code unsafe n'existe pas en VB.NET vous ne pouvez donc pas utiliser les
pointeurs de ce bout de code.
Vous avez 2 solutions de contournement :
- Soit vous n'utilisez pas de code unsafe, dans ce cas vous parcourez un
tableau de Byte managé, mais vous perdez en performance...
- Soit vous mettez ce bout de code dans un projet C# et vous appelez cette
méthode à partir de vos projets VB (en ajoutant une référence au projet
C#)...

Cordialement

--
Gilles TOURREAU - MVP C#


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Patrice
Ou éventuellement (avec un petit hit de performance), copier les données
dans un tableau managé. Voir par exemple :
http://www.techheadbrothers.com/Articles.aspx/manipulation-images-vb-net-csharp-page-3

--
Patrice


"Alex" a écrit dans le message de news:

Bonjour,

J'ai un trouvé un bout de code fort interressant sur le web mais
malheuresement pour moi il est ne C#. Je ne suis pas allergique au C ou c#
, encore moins étranger, mais certaines lacunes m'empêche de transcrire un
bout de code en VB .net
Habituellement la transcription ne me pose pas de problèmes. JE sais aussi
qu'il existe des moteur de transcription automatiques. Mais là je pense
savoir mais j'aimerais être sûr.

Ce bout de code permet de modifier le contraste d'une image bitmap :

public static bool Contrast(Bitmap b, sbyte nContrast)
{
if (nContrast < -100) return false;
if (nContrast > 100) return false;

double pixel = 0, contrast = (100.0+nContrast)/100.0;

contrast *= contrast;

int red, green, blue;

// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;

unsafe
{
byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;

for(int y=0;y<b.Height;++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];

pixel = red/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[2] = (byte) pixel;

pixel = green/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[1] = (byte) pixel;

pixel = blue/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;

p += 3;
}
p += nOffset;
}
}

b.UnlockBits(bmData);

return true;
}

La partie qui m'embête est celle ci :

byte * p = (byte *)(void *)Scan0;

je pense qu'il s'agit de pointeurs,ceux entres parentheses des cast de
pointeurs mais je n'en suis pas sur, et je n'arrive pas à bien le
retranscrire en VB.Net, une aide ne serait pas de refus !


Merci d'avance,

Alexandre.




Avatar
Alex
Merci à tout deux pour vos réponses.

J'ai néanmoins trouvé une autre solution visant à utiliser colormatrix, que
je ne connaissais pas et qui est vraiment très très très utile pour le
manipulation d'images !
Toutefois j'ai regardé votre lien qui je pense me servira dans un autre de
mes projets ;)

Encore merci !

"Gilles TOURREAU [MVP]" a écrit dans le message de
news:
Le Wed, 09 Jan 2008 23:01:12 +0100, Alex a écrit:

Bonjour,

J'ai un trouvé un bout de code fort interressant sur le web mais
malheuresement pour moi il est ne C#. Je ne suis pas allergique au C ou
c# , encore moins étranger, mais certaines lacunes m'empêche de
transcrire un bout de code en VB .net
Habituellement la transcription ne me pose pas de problèmes. JE sais
aussi qu'il existe des moteur de transcription automatiques. Mais là je
pense savoir mais j'aimerais être sûr.

Ce bout de code permet de modifier le contraste d'une image bitmap :

public static bool Contrast(Bitmap b, sbyte nContrast)
{
if (nContrast < -100) return false;
if (nContrast > 100) return false;

double pixel = 0, contrast = (100.0+nContrast)/100.0;

contrast *= contrast;

int red, green, blue;

// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width,
b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;

unsafe
{
byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;

for(int y=0;y<b.Height;++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];

pixel = red/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[2] = (byte) pixel;

pixel = green/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[1] = (byte) pixel;

pixel = blue/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;

p += 3;
}
p += nOffset;
}
}

b.UnlockBits(bmData);

return true;
}

La partie qui m'embête est celle ci :

byte * p = (byte *)(void *)Scan0;

je pense qu'il s'agit de pointeurs,ceux entres parentheses des cast de
pointeurs mais je n'en suis pas sur, et je n'arrive pas à bien le
retranscrire en VB.Net, une aide ne serait pas de refus !


Merci d'avance,

Alexandre.





Bonjour,

Le code unsafe n'existe pas en VB.NET vous ne pouvez donc pas utiliser les
pointeurs de ce bout de code.
Vous avez 2 solutions de contournement :
- Soit vous n'utilisez pas de code unsafe, dans ce cas vous parcourez un
tableau de Byte managé, mais vous perdez en performance...
- Soit vous mettez ce bout de code dans un projet C# et vous appelez cette
méthode à partir de vos projets VB (en ajoutant une référence au projet
C#)...

Cordialement

--
Gilles TOURREAU - MVP C#


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr


Avatar
chevalier.lardon
Bonjour Alex,

Avez-vous réussi à utiliser les colormatrix pour gérer le contraste ?
Je serai bien intéressé par ce code. Pourriez-vous l'ajouter à la
suite de la discussion svp ?

Merci beaucoup.