【发布时间】:2015-11-11 07:34:19
【问题描述】:
我正在创建一个使用 Portable AForge Imaging Library 的应用程序。我有一个 Android.Graphics.Bitmap 图像,它被转换为 System.Drawing.Bitmap。
System.Drawing.Bitmap photo = (System.Drawing.Bitmap)androidPhoto;
然后我尝试像这样创建 UnmanagedImage BitmapData:
UnmanagedImage data = UnmanagedImage.FromManagedImage(photo);
这会抛出 AForge.Imaging.UnsupportedImageFormatException: Unsupported pixel format of the source image。
我对导致此问题的原因进行了广泛研究,发现我需要一个 PixelFormat 为 24bpp 或 8bpp 的位图,但我的图像是 16bpp。 我寻找转换为 24bpp 或 8bpp 的方法并尝试过
var photo8bpp = photo.Clone (System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
和
var photo24bpp = photo.Clone (System.Drawing.Imaging.PixelFormat.Format24bppRgb);
我什至尝试过:
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:对象引用未设置为实例 at 处的对象(包装器未知) ImagePixelEnumerator.Helpers.Pixels.NonIndexed.PixelDataRgb565:PtrToStructure (intptr,object) at (wrapper managed-to-native) System.Runtime.InteropServices.Marshal:PtrToStructure (intptr,System.Type) 在 ImagePixelEnumerator.Helpers.Pixel.ReadRawData (IntPtr imagePointer) [0x00000] 在 d:\Users\Anders\Documents\Visual Studio 2013\Projects\aforge\Sources\System.Drawing\Helpers\Pixel.cs:272
我做错了什么?
【问题讨论】:
-
您好,我是 Portable AForge 的维护者。我需要在 Android 下检查这个特定的调用,稍后我会返回分析结果。但只是为了检查一下,您转换为
UnmanagedImage的目的是什么?您是否无法使用 Shim.Drawing 库中的System.Drawing.Bitmap或System.Drawing.Image获得相同的结果,并最终将其转换为Android.Graphics.Bitmap? -
@AndersGustafsson AForge 中的边缘检测功能需要 8BPP 图像才能正常工作。您可以将 Android 位图转换为 System.Drawing.Bitmap 就好了,但是如果您尝试将转换后的位图用作参数,则转换为灰度的 AForge 函数会引发错误。
标签: c# android bitmap xamarin aforge