我正在使用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加载它?
答案 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”等...(区分大小写)