1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
// Mon objectif ici est d'avoir une Form avec 2 PicturesBox. La premiere affiche l'image de départ (sans traitement).
// La seconde doit me permettre de visualiser les effets de mon traitement. Entre les deux je souhaite disposer des pixels
// dans un tableau en mémoire pour effectuer des operations "matricielle" dessus.
// ImgSrc est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
// ImgTgt est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
private void button2_Click(object sender, EventArgs e)
{
int i;
/* Calcul, creation et initialisation des variables propres à l'image source */
PixelCountSrc = ImgSrc.Width * ImgSrc.Height;
BmpSrc = new Bitmap(ImgSrc.Image);
// A cet endroit je peut lire que le pixelFormat de BmpSrc est Format32bppArgb.
// Q1 - Savez-vous pourquoi c'est pas le meme que celui de l'image passé en parametre au constructeur ?
DepthSrc = ImgSrc.Image.PixelFormat;
FullImage = new Rectangle(0, 0, BmpSrc.Width, BmpSrc.Height);
// bitmapDataSrc = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite, BmpSrc.PixelFormat);
bitmapDataSrc = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
// Ici le LockBits se fait sur une instance qui comporte deja une propriété PixelFormat donc le respecifier ici n'a de sens que pour "Forcer" un format de sortie.
// Q2 - Ai-je bon ? si non, pourriez-vous m'eclairer ?
/* Calcul, creation et initialisation des variables propres à l'image de sortie */
BmpTgt = new Bitmap(ImgDst.Image);
// A cet endroit je peut lire que le pixelFormat de BmpTgt est Format32bppArgb.
// Mais je prendrai la réponse à Q1 ici aussi.
bitmapDataTgt = BmpTgt.LockBits(FullImage, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
// blablabla, je prendrai ici aussi la réponse à Q2
/* Calcul, creation et initialisation des variables propres au buffer de travail */
BmpPixels = new byte[PixelCountSrc * 3];
// Bon ici j'ai mis 3 car j'ai demandé Format24bppRgb au dessus. Mais j'adapterai en fonction des réponses précedentes
Marshal.Copy(bitmapDataSrc.Scan0, BmpPixels, 0, BmpPixels.Length);
/* Traitement bidon */
for (i = 0; i < BmpPixels.Length; i += 3)
{
BmpPixels[i] = (byte)(0xFF); // Red
BmpPixels[i + 1] = (byte)0xFF; // Green
BmpPixels[i + 2] = (byte)0xFF; // Blue
}
// Vu que la PictureBox est en 24Bpp et le bitmap en 32Bpp je suppose que la ligne suivante est incorrecte
Marshal.Copy(BmpPixels, 0, bitmapDataTgt.Scan0, BmpPixels.Length);
// Je n'es suis pas encore là (bien malheureusement ....)
if (ImgDst.Image != null)
ImgDst.Dispose();
ImgDst.Image = BmpTgt;
ImgDst.Refresh();
}
} |
Partager