我有一些我在网上找到的代码。
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 ));
它也没有给我一个图像(在将它分配给Image的Source属性之后)
任何人都可以给我任何提示吗? 谢谢 阿伦
答案 0 :(得分:1)
将数据直接加载到BitmapImage中不起作用,因为它期望以图像文件格式存储数据,就像您在.bmp或.png文件中看到的那样。您改为提供了原始像素数据。
你的第二种方法看起来应该有效但是有一些不必要的步骤。您找到的代码是将像素数据从BGR24重写为RGB24,但您应该可以直接将其加载为BGR24:
System.Windows.Media.Imaging.BitmapSource.Create(width, height, 96, 96,
System.Windows.Media.PixelFormats.Bgr24, null, pFrame, linesize * height,
width * 3 ));
无论如何,你有没有详细说明为什么它没有给你一个图像?创建位图时是否有任何异常?它给出了错误的颜色或错误的尺寸吗?您确定所有源数据都在那里吗?创建后,您在BitmapSource的属性上看到了什么?
答案 1 :(得分:0)