首页 > 解决方案 > Xamarin Mac,将 CGImage 转换为 .NET System.Drawing.Image

问题描述

我正在使用 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 加载它?

标签: c#macosxamarinxamarin.mac

解决方案


您可以使用在文件、. 或 CG 使用者CGImageDestination中创建您的 png/jpeg 表示。CGImageNSMutableData

NSMutableData如果您的 C# 库可以对字节序列/数组进行操作,那么您可以使用生成的(via 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;

注意:不要使用 aUTType作为您的typeIdentifier,您的 CGImageDestination 将始终为 null,使用“public.png”、“public.jpeg”等...(这些区分大小写)


推荐阅读