如何在 iOS 上使用 Xamarin 旋转文件中的图像

Posted

技术标签:

【中文标题】如何在 iOS 上使用 Xamarin 旋转文件中的图像【英文标题】:How do I rotate an image from a file with Xamarin on iOS 【发布时间】:2015-02-20 18:38:57 【问题描述】:

我这几天一直在尝试旋转图像,但我得到的最好的图像仍然是黑色图像。

我怀疑这可能与我正在旋转的点有关,但我不确定。我这么说是因为我尝试了提出的整个解决方案 here 并用 Xamarin 术语进行了翻译,但这没有用。

这是我的代码:

public void Rotate (string sourceFile, bool isCCW)
  using (UIImage sourceImage = UIImage.FromFile(sourceFile))
     
    var sourceSize = sourceImage.Size; 

    UIGraphics.BeginImageContextWithOptions(new CGSize(sourceSize.Height, sourceSize.Width), true, 1.0f); 
    CGContext bitmap = UIGraphics.GetCurrentContext();

    // rotating before DrawImage didn't work, just got the image cropped inside a rotated frame
    // bitmap.RotateCTM((float)(isCCW ? Math.PI / 2 : -Math.PI / 2)); 

    // swapped Width and Height because the image is rotated
    bitmap.DrawImage(new CGRect(0, 0, sourceSize.Height, sourceSize.Width), sourceImage.CGImage);

    // rotating after causes the resulting image to be just black
    bitmap.RotateCTM((float)(isCCW ? Math.PI / 2 : -Math.PI / 2)); 

    var resultImage = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();

    if (targetFile.ToLower().EndsWith("png"))
        resultImage.AsPNG().Save(sourceFile, true);
    else
        resultImage.AsJPEG().Save(sourceFile, true);  
  

【问题讨论】:

【参考方案1】:

您似乎想要获取UIImage,然后将其顺时针旋转 90 度或逆时针旋转 90 度。实际上,您只需几行代码就可以做到这一点:

public void RotateImage(ref UIImage imageToRotate, bool isCCW)

   var imageRotation = isCCW ? UIImageOrientation.Right : UIImageOrientation.Left;
   imageToRotate = UIImage.FromImage(imageToRotate.CGImage, imageToRotate.CurrentScale, imageRotation);
  

我们使用接受 3 个参数的UIImage.FromImage()。第一个是CGImage,我们可以从您尝试旋转的UIImage 中获取。第二个参数是图像的比例。第三个参数很重要。我们可以使用UIImageOrientation.Right(逆时针90度)或UIImageOrientation.Left(顺时针90度)旋转它。您可以查看 Apple 文档以了解其他 UIImageOrientation 常量的含义:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/c/tdef/UIImageOrientation

更新: 请注意,上面的代码只更改了 EXIF 标志,并且调用它两次不会将图像旋转 180 度。

添加此代码以使结果累积:

UIGraphics.BeginImageContextWithOptions(new CGSize((float)h, (float)w), true, 1.0f);   
imageToRotate.Draw(new CGRect(0, 0, (float)h, (float)w)); 

var resultImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
imageToRotate = resultImage;

【讨论】:

漂亮,2行!谢谢!

以上是关于如何在 iOS 上使用 Xamarin 旋转文件中的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上使用 Xamarin WebView 下载本机浏览器等文件?

Xamarin.iOS 中的文件选择器

如何正确导入 Xamarin 项目?

如何使用适用于 Android 和 iOS 的 Xamarin 表单在特定频道上的 youtube 上上传视频?

如何在 Xamarin.iOS 中使用 FCM(Firebase 云消息传递)发送 iOS 推送通知

如何在 Xamarin.iOS 中正确包装本机 c 库