Question

J'ai un code que je trouve quelque part sur le Net.

unsafe static Bitmap SaveFrame(IntPtr pFrame, int width, int height)
    {
        try
        {
            int x, y;
            int linesize = width * 3;
            byte* scan0 = (byte*)Marshal.ReadIntPtr(pFrame);

            IntPtr bufferPtr = Marshal.AllocHGlobal(linesize * height);
            byte* buffer = (byte*)bufferPtr;

            for (y = 0; y < height; y++)
            {
                for (x = 0; x < linesize; x = x + 3)
                {
                    *buffer++ = (byte)*(scan0 + y * linesize + x + 2);
                    *buffer++ = (byte)*(scan0 + y * linesize + x + 1);
                    *buffer++ = (byte)*(scan0 + y * linesize + x);
                }
            }
            Bitmap b = new Bitmap(width, height, linesize, System.Drawing.Imaging.PixelFormat.Format24bppRgb, bufferPtr);



            return b;
        }
        catch (Exception ex) { throw new Exception(ex.Message); }
    }

Ce code ci-dessus me donne un bitmap valide, mais je suis en utilisant WPF et que vous voulez qu'il soit dans un BitmapImage

Sans passer par ce processus, Im essayant le code

byte[] ptr = ....
Marshal.Copy(pFrame, ptr , 0, ptr .Length);
BitmapImage aBitmapImage = new BitmapImage(); 
aBitmapImage.BeginInit();
aBitmapImage.StreamSource = new MemoryStream(ptr); //FLastImageMemStream;//
aBitmapImage.EndInit();

qui ne fonctionne pas ...

J'ai aussi essayé

System.Windows.Media.Imaging.BitmapSource.Create(width, height, 96, 96,
    System.Windows.Media.PixelFormats.Rgb24, null, bufferPtr,linesize * height,
    width * 3 ));

qui ne me donne pas aussi une image, il semble (après l'avoir assigné à la propriété Source de l'image)

Quelqu'un peut-il me donner des conseils? Merci Allen

Était-ce utile?

La solution

Chargement des données directement dans le BitmapImage n'a pas fonctionné parce qu'il est attend des données dans un format de fichier image, comme vous verriez dans un fichier .bmp ou .png. Vous avez fourni des données brutes des pixels à la place.

Votre deuxième aspect approche comme il devrait fonctionner, mais a quelques étapes inutiles à lui. Le code que vous avez trouvé est en train de réécrire les données de pixels de BGR24 à RGB24, mais vous devriez être en mesure de charger juste en directement BGR24:

System.Windows.Media.Imaging.BitmapSource.Create(width, height, 96, 96,
    System.Windows.Media.PixelFormats.Bgr24, null, pFrame, linesize * height,
    width * 3 ));

Quoi qu'il en soit, avez-vous des détails sur pourquoi il ne vous donne pas une image? Avez-vous eu des exceptions lors de la création du bitmap? Est-ce qu'il donne de mauvaises couleurs ou la mauvaise taille? Etes-vous sûr toutes les données de la source est là? Que voyez-vous sur les propriétés du BitmapSource après l'avoir créé?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top