C# 调用UnmanagedImage时不支持源图像的像素格式。FromManagedImage(位图)

C# 调用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

我正在创建一个应用程序,它使用便携式的一个图像库。我有一个Android.Graphics.Bitmap图像,它被转换为System.Drawing.Bitmap

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