C# --> VB.Net

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles TOURREAU [MVP]
Le #12215001
Le Wed, 09 Jan 2008 23:01:12 +0100, 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.





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
Patrice
Le #12214851
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"
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.




Alex
Le #12214541
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]" news:
Le Wed, 09 Jan 2008 23:01:12 +0100, 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.





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


chevalier.lardon
Le #12208801
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.
Publicité
Poster une réponse
Anonyme