如何在Xamarin iOS中将Stream转换为UIImage?

5

我有一个Xamarin Forms解决方案,在iOS项目中,我想将流中的图像转换为UIImage。我使用以下代码获取流:

var _captureSession = new AVCaptureSession();
var _captureDevice = AVCaptureDevice.GetDefaultDevice(AVMediaType.Video);

var output = new AVCaptureStillImageOutput { OutputSettings = new NSDictionary(AVVideo.CodecKey, AVVideo.CodecJPEG) };

NSError error;
_captureSession.AddInput(new AVCaptureDeviceInput(_captureDevice, out error));
_captureSession.AddOutput(output);
_captureSession.StartRunning();

var buffer = await output.CaptureStillImageTaskAsync(output.Connections[0]);
NSData data = AVCaptureStillImageOutput.JpegStillToNSData(buffer);
Stream stream = data.AsStream();

我需要UIImage以便使用以下代码旋转它:

public UIImage RotateImage(UIImage image)
{
    CGImage imgRef = image.CGImage;
    float width = imgRef.Width;
    float height = imgRef.Height;
    CGAffineTransform transform = CGAffineTransform.MakeIdentity();
    RectangleF bounds = new RectangleF(0, 0, width, height);

    float scaleRatio = bounds.Size.Width / width;
    SizeF imageSize = new SizeF(imgRef.Width, imgRef.Height);
    UIImageOrientation orient = image.Orientation;
    float boundHeight;

    if (width > height)
    {
        boundHeight = bounds.Size.Height;
        bounds.Size = new SizeF(boundHeight, bounds.Size.Width);
        transform = CGAffineTransform.MakeTranslation(imageSize.Height, 0);
        transform = CGAffineTransform.Rotate(transform, (float)Math.PI / 2.0f);
    }

    UIGraphics.BeginImageContext(bounds.Size);
    CGContext context = UIGraphics.GetCurrentContext();

    context.ScaleCTM(-scaleRatio, scaleRatio);
    context.TranslateCTM(-height, 0);

    context.ConcatCTM(transform);

    context.DrawImage(new RectangleF(0, 0, width, height), imgRef);
    UIImage imageCopy = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();

    return imageCopy;
}

如何将 Stream 转换为 UIImage?
1个回答

13
你需要先将你的流转换为NSData,然后才能将其转换为UIImage。
var imageData = NSData.FromStream(stream);
var image = UIImage.LoadFromData(imageData);

这两个都是 IDisposable,因此您可以根据自己的情况使用基于using语句。如果您不使用using语句,请确保手动从内存中释放图像对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接