c# - 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 加载它?
解决方案
您可以使用在文件、. 或 CG 使用者CGImageDestination
中创建您的 png/jpeg 表示。CGImage
NSMutableData
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”等...(这些区分大小写)
推荐阅读
- linux - 从 Linux 在 R 3.6.0 中安装“udunits2”时如何解决“错误:找不到 libudunits2.a”?
- linux - 在使用 getopts 时如何在 Linux shell 脚本中获取程序参数?
- vue.js - 向现有的 Vuejs 应用程序添加 lang
- javascript - 索引在地图返回内不断重置
- javascript - 通过扩展运算符中的变量传递对象属性
- java - Android Java - 从不同的类调用方法以从数据库中删除数据
- python - 从对列表中制作 Numpy 对称矩阵
- bash - 查找时错误:'cd:找不到命令'
- gitlab - Gitlab CI 强制我在使用多个包含时定义阶段
- node.js - 从 AD 凭据获取 NTLM 令牌