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

时间:2015-02-20 18:38:57

标签: ios image-processing xamarin.ios xamarin uiimage

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

我怀疑它可能与我转过来的点有关,但我不确定。我之所以这么说,是因为我尝试了提出的整个解决方案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 个答案:

答案 0 :(得分:4)

看起来您想拍摄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。第二个参数是图像的比例。第三个参数是重要的参数。我们可以使用UIImageOrientation.Left(90度逆时针)或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; (90度CW)旋转它。您可以查看Apple文档以了解其他UIImageOrientation常量的含义:

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

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

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

{{1}}