C# 调用UnmanagedImage时不支持源图像的像素格式。FromManagedImage(位图)
我正在创建一个应用程序,它使用便携式的一个图像库。我有一个Android.Graphics.Bitmap图像,它被转换为System.Drawing.BitmapC# 调用UnmanagedImage时不支持源图像的像素格式。FromManagedImage(位图),c#,android,bitmap,xamarin,aforge,C#,Android,Bitmap,Xamarin,Aforge,我正在创建一个应用程序,它使用便携式的一个图像库。我有一个Android.Graphics.Bitmap图像,它被转换为System.Drawing.Bitmap System.Drawing.Bitmap photo = (System.Drawing.Bitmap)androidPhoto; 然后,我尝试创建非托管图像位图数据,如下所示: UnmanagedImage data = UnmanagedImage.FromManagedImage(photo); 这会引发arge.Imag
System.Drawing.Bitmap photo = (System.Drawing.Bitmap)androidPhoto;
然后,我尝试创建非托管图像位图数据,如下所示:
UnmanagedImage data = UnmanagedImage.FromManagedImage(photo);
这会引发arge.Imaging.UnsupportedImageFormatException:源图像的不支持像素格式
我对这个问题的原因做了广泛的研究,发现我需要一个像素格式为24bpp或8bpp的位图,但我的图像是16bpp。
我想办法转换成24bpp或8bpp,我试过了
var photo8bpp = photo.Clone (System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
及
我甚至试过:
AForge.Imaging.Image.FormatImage (ref photo);
我最后一次尝试的是这种转换方法:
private System.Drawing.Bitmap Convert(System.Drawing.Bitmap oldbmp)
{
using (var ms = new MemoryStream())
{
oldbmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Position = 0;
return (System.Drawing.Bitmap)(System.Drawing.Image.FromStream(ms));
}
}
我所做的一切都导致了这一点:
System.AggregateException:发生一个或多个错误。-->
System.NullReferenceException:对象引用未设置为实例
位于的对象的(包装器未知)
ImagePixelEnumerator.Helpers.Pixels.NonIndexed.PixelDataRgb565:PtrToStructure
(intptr,object)at(包装器管理为本机)
System.Runtime.InteropServices.Marshal:PtrToStructure
(intptr,系统类型)在
ImagePixelEnumerator.Helpers.Pixel.ReadRawData(IntPtr imagePointer)
[0x00000]位于d:\Users\Anders\Documents\Visual Studio中
2013\Projects\aforge\Sources\System.Drawing\Helpers\Pixel.cs:272
我做错了什么?我想我已经解决了:
var data = new UnmanagedImage(androidPhoto.LockPixels(), androidPhoto.Width,
androidPhoto.Height, androidPhoto.Width,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
嗨,我是便携式AForge的维护者。我需要在Android下检查这个特殊的调用,稍后我会返回分析结果。但请检查一下,您转换为
非托管图像的目的是什么?您是否无法使用最终转换到Android.Graphics.Bitmap的Shim.Drawing库中的System.Drawing.Bitmap
或System.Drawing.Image
获得相同的结果?@AndersCustomafsson Forge中的边缘检测功能需要8BPP图像才能正常工作。您可以将Android位图强制转换为System.Drawing.Bitmap,但如果您尝试将转换后的位图用作参数,则转换为灰度的AForge函数会引发错误。
var data = new UnmanagedImage(androidPhoto.LockPixels(), androidPhoto.Width,
androidPhoto.Height, androidPhoto.Width,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);