C # Bitmap BitmapImage bitmapsource - PullRequest
       50

C # Bitmap BitmapImage bitmapsource

0 голосов
/ 17 ноября 2010

У меня есть какой-то код, который я нашел где-то в сети.

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); }
    }

Этот код выше дает мне действительное изображение, однако я использую WPF и хочу, чтобы он был в BitmapImage

Не пройдя этот процесс, я пробую код

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

, который не работает ...

Я также пробовал

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

, который также делаетне дает мне изображение, которое кажется (после присвоения его свойству Source для Image)

Может кто-нибудь дать мне какие-нибудь подсказки?Спасибо Аллен

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Загрузка данных непосредственно в BitmapImage не сработала, потому что ожидаются данные в формате файла изображения, как вы могли бы увидеть в файле .bmp или .png.Вместо этого вы указали необработанные данные пикселей.

Ваш второй подход выглядит так, как будто он должен работать, но в нем есть некоторые ненужные шаги.Код, который вы нашли, переписывает пиксельные данные с BGR24 на RGB24, но вы можете просто загрузить их непосредственно как BGR24:картинка?Получали ли вы какие-либо исключения при создании растрового изображения?Это дало неправильные цвета или неправильный размер?Вы уверены, что все исходные данные есть?Что вы видите в свойствах BitmapSource после его создания?

0 голосов
/ 17 ноября 2010
...