D'après ce que j'ai lu sur Internet, la valeur Y est la valeur de luminance et peut être utilisée pour créer une image en niveaux de gris. Le lien suivant: http://www.bobpowell.net/grayscale.htm, a peu de code C# sur l'élaboration de la luminance d'une image bitmap:Échelle de gris Image provenant des données YUV420p
{
Bitmap bm = new Bitmap(source.Width,source.Height);
for(int y=0;y<bm.Height;y++) public Bitmap ConvertToGrayscale(Bitmap source)
{
for(int x=0;x<bm.Width;x++)
{
Color c=source.GetPixel(x,y);
int luma = (int)(c.R*0.3 + c.G*0.59+ c.B*0.11);
bm.SetPixel(x,y,Color.FromArgb(luma,luma,luma));
}
}
return bm;
}
I ont une méthode qui renvoie les valeurs YUV et que les données Y dans un tableau d'octets. J'ai le morceau actuel de code et il échoue sur Marshal.Copy - a essayé de lire ou écrire la mémoire protégée.
public Bitmap ConvertToGrayscale2(byte[] yuvData, int width, int height)
{
Bitmap bmp;
IntPtr blue = IntPtr.Zero;
int inputOffSet = 0;
long[] pixels = new long[width * height];
try
{
for (int y = 0; y < height; y++)
{
int outputOffSet = y * width;
for (int x = 0; x < width; x++)
{
int grey = yuvData[inputOffSet + x] & 0xff;
unchecked
{
pixels[outputOffSet + x] = UINT_Constant | (grey * INT_Constant);
}
}
inputOffSet += width;
}
blue = Marshal.AllocCoTaskMem(pixels.Length);
Marshal.Copy(pixels, 0, blue, pixels.Length); // fails here : Attempted to read or write protected memory
bmp = new Bitmap(width, height, width, PixelFormat.Format24bppRgb, blue);
}
catch (Exception)
{
throw;
}
finally
{
if (blue != IntPtr.Zero)
{
Marshal.FreeHGlobal(blue);
blue = IntPtr.Zero;
}
}
return bmp;
}
Toute aide serait appréciée?
Lors de l'utilisation de LockBits(), vous devez utiliser picData.Stride au lieu de le calculer vous-même. Notez également qu'il peut être négatif (dans ce cas, Scan0 pointe vers la dernière ligne de balayage). Aussi, avec le multiplicateur 3 * x, vous devriez utiliser Format24bppRb au lieu de 32. –
Ok, il s'avère que je n'obtenais pas les données Y correctes, donc cela a été corrigé et je reçois maintenant une image en niveaux de gris en utilisant ce qui précède code. Merci pour votre aide Saxon. – fergs