当我在某些图像上运行核心图像过滤器(如 CIHueAdjust)时,它们会意外旋转 90 度 - 逆时针。这种失真似乎只发生在使用 iOS 设备纵向拍摄的图像上。
这是一个简单的 xcode 项目,具有图像导入和 CIHueAdjust 过滤器: owolf.net/uploads/StackOverflow/HueAdjustProject2.zip
如果我在使用 iPhone 拍摄的纵向图像上运行过滤器(如此处链接的这个),结果就像下面的屏幕截图。
这个有办法解决吗??谢谢阅读。
当我在某些图像上运行核心图像过滤器(如 CIHueAdjust)时,它们会意外旋转 90 度 - 逆时针。这种失真似乎只发生在使用 iOS 设备纵向拍摄的图像上。
这是一个简单的 xcode 项目,具有图像导入和 CIHueAdjust 过滤器: owolf.net/uploads/StackOverflow/HueAdjustProject2.zip
如果我在使用 iPhone 拍摄的纵向图像上运行过滤器(如此处链接的这个),结果就像下面的屏幕截图。
这个有办法解决吗??谢谢阅读。
图像具有不同的方向。应用过滤器后,您将失去方向。您应该使用简单的仿射变换来补偿方向。
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
}
您可以使用具有 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;
}
我遇到了同样不受欢迎的轮换问题。
我通过记住被过滤的 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 包含一个布尔值,指示应用过滤器之前的状态。