Xamarin Mac,将CGImage转换为.NET System.Drawing.Image

时间:2018-11-07 18:37:19

标签: c# macos xamarin xamarin.mac

我正在使用Xamarin / MONO编写MacOS应用程序,我想从屏幕上截取图像并将其与.NET中的其他图像库一起使用

我发现我可以像这样使用本机系统库

[DllImport(Constants.CoreGraphicsLibrary)]
static extern IntPtr CGWindowListCreateImage(CGRect screenBounds, CGWindowListOption windowOption, uint windowID, CGWindowImageOption imageOption);

但是,一旦我有了CGImage intptr,对我来说就不好了,因为我想做一些System.Drawing它已经在其他平台上实现的东西。有没有一种方法可以使用IntPtr并以某种方式获取System.Drawing图像?还是将CGImage intptr保存到磁盘并使用System.Drawing加载它?

1 个答案:

答案 0 :(得分:0)

您可以使用CGImageDestination在文件CGImage或CG使用者中创建NSMutableData的png / jpeg表示形式。

如果您的C#库可以对字节的序列/数组起作用,则可以将生成的NSMutableData(通过GetBytes)(而不是将文件保存到磁盘)复制PNG / JPEG格式的字节到缓冲区,以便您在内存中切片和切块...

var cgImagePtr = CGWindowListCreateImage(new CGRect(0, 0, 100, 100), CGWindowListOption.All, 0, CGWindowImageOption.Default);
using (var url = new NSUrl("file", "localhost", "/Users/Sushi/Desktop/someFileName.png"))
using (var cgImage = new CGImage(cgImagePtr))
using (var destination = CGImageDestination.Create(url, "public.png", 1)) 
{
    destination.AddImage(cgImage);
    destination.Close();
}
cgImagePtr = null;

注意:请勿将UTType用作typeIdentifier,您的CGImageDestination将始终为空,请使用“ public.png”,“ public.jpeg”等...(区分大小写)