1

当我在某些图像上运行核心图像过滤器(如 CIHueAdjust)时,它们会意外旋转 90 度 - 逆时针。这种失真似乎只发生在使用 iOS 设备纵向拍摄的图像上。

这是一个简单的 xcode 项目,具有图像导入和 CIHueAdjust 过滤器: owolf.net/uploads/StackOverflow/HueAdjustProject2.zip

如果我在使用 iPhone 拍摄的纵向图像上运行过滤器(如此处链接的这个),结果就像下面的屏幕截图。

这个有办法解决吗??谢谢阅读。

在此处输入图像描述

4

4 回答 4

2

图像具有不同的方向。应用过滤器后,您将失去方向。您应该使用简单的仿射变换来补偿方向。

于 2012-08-17T17:36:02.583 回答
2
if ([image imageOrientation] == 3) {
    imageView.transform = CGAffineTransformMakeRotation(M_PI / 2.0);
} else if ([image imageOrientation] == 2) {
    imageView.transform = CGAffineTransformMakeRotation((M_PI / 2.0)*-1);
}  else if ([image imageOrientation] == 1) {
    imageView.transform = CGAffineTransformMakeRotation(M_PI);    
}else {
    //no rotation necessary    
}
于 2012-08-18T07:09:04.807 回答
1

您可以使用具有 3 个参数(CIImage、比例、方向 = 右)的函数 UIIMage.FromImage 将图像旋转回原始方向。这是代码片段:

var rotatedCIImage = imageEffectFunc (src); //rotatedCIImage = your CIImage after taken effect that has been rotated 90° counter clockwise.

if (rotatedCIImage != null) {
   UIImage result = UIImage.FromImage(rotatedCIImage,1.0f,UIImageOrientation.Right);
   return result;
} else {
   return null;
}
于 2013-01-24T09:38:12.690 回答
0

我遇到了同样不受欢迎的轮换问题。

我通过记住被过滤的 UIImage 的高度是否大于应用过滤器之前的宽度来解决它。

应用过滤器后,我再次检查 UIImage 高度是否仍大于宽度。如果不是我将 UIImage 旋转了 90 度。

在确定滤镜已旋转图像后,我在这里使用了扩展来旋转 UIImage。: 在 Swift 中旋转 UIImage

我在应用过滤器之前和应用过滤器之后都使用这个示例来获取 UIImage 的高度和宽度: iphone - 我如何获取 uiimage 的高度和宽度

我进行更正的代码如下所示:

if heightIsLargerThanWidth && slideShowImageView_2.image!.size.height < slideShowImageView_2.image!.size.width
{
    self.slideShowImageView_2.image = self.slideShowImageView_2.image?.rotate(radians: .pi/2)
}

注意 heightIsLargerThanWidth 包含一个布尔值,指示应用过滤器之前的状态。

于 2020-04-09T12:22:38.380 回答