如何最好地将原始像素数据转换为PNG文件?

时间:2014-09-23 16:45:55

标签: ios xamarin.ios xamarin

(我正在开发一个针对iOS的Xamarin.Forms项目,但我觉得我需要使用monotouch来实现我的目标。)

我有一个从函数中得到的数组,这个数组代表了一些我希望保存并稍后显示的位图数据。我一直在看文档,我没有看到从字节到位图到文件的路径,这和我期望的一样清晰。在WinForms中,我创建了一个System.Drawing.Bitmap,然后使用Save()方法。在Xamarin for Android中,Android.Graphics.BitmapCompress()方法,可让我输出到流。我无法弄清楚Xamarin iOS中的等价物是什么。

像素数据是每像素32位,每个组件8位,ARGB。我已经知道我可以从中创建一个CGImage,目前通过CGBitmapContext。我可以从中获得UIImage,但下一个明确的方法是UIImage.SaveToPhotoStream(),这不是我想要做的。我看到AsPng()返回NSData,这似乎是一种方法。我还没有完成它的工作(因为某些原因提供者决定输出int []而不是byte [])但我很好奇:是否有更简单的方法从原始像素数据转到PNG文件?

2 个答案:

答案 0 :(得分:3)

您可以使用ImageIO来更好地控制序列化的内容。

你仍然需要让自己成为一个可以使用的CGImage。

使用三个CGImageDestination.Create重载之一来选择要生成的输出类型(保存到NSMutableData对象,NSUrl或您自己的数据提供程序),添加图像,然后关闭CGImageDestination

这样的事情:

var storage = new NSMutableData ()
var dest = CGImageDestination.Create (storage, MobileCoreServices.UTType.PNG, imageCount: 1);
dest.AddImage (yourImage);
dest.Close ();   // This saves the data

如果要创建具有多个帧的图像,可以将Create for imageCount中的参数更改为其他数字,在这种情况下,您还将重复调用AddImage。

答案 1 :(得分:0)

如果您希望将图像写入文件,那么它将非常简单:

var bytes = image.AsPNG().ToArray();
await stream.WriteAsync(bytes, 0, bytes.Length);