当我在某些图像上运行核心图像过滤器(如CIHueAdjust)时,它们会意外地旋转90度 - 逆时针旋转。这种失真似乎只发生在纵向方向下使用iOS设备拍摄的图像时。
这是一个简单的xcode项目,它具有图像导入和CIHueAdjust过滤器: owolf.net/uploads/StackOverflow/HueAdjustProject2.zip
如果我在使用iPhone(like this one linked here)拍摄的纵向图像上运行滤镜,结果就像下面的屏幕截图一样。
有没有解决这个问题?谢谢你的阅读。
答案 0 :(得分:2)
图像具有不同的方向。应用过滤器后,您将失去方向。你应该用简单的仿射变换来补偿方向。
答案 1 :(得分:1)
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
}
答案 2 :(得分:0)
您可以使用带有3个参数的函数UIIMage.FromImage(CIImage,scale,Orientation = Right)将图像旋转回原始方向。以下是代码段:
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;
}
答案 3 :(得分:0)
我遇到了同样不希望的轮换问题。
我通过记住要过滤的UIImage的高度是否大于应用过滤器之前的宽度来解决该问题。
应用过滤器后,我再次检查UIImage的高度是否仍然大于宽度。如果不是,我会将UIImage旋转90度。
在确定滤镜已旋转图像之后,我在此处利用扩展来旋转UIImage。 : Rotating UIImage in Swift
在此示例中,我在应用滤镜之前和应用滤镜之后都获取了UIImage的高度和宽度: iphone - how can i get the height and width of 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包含一个布尔值,指示应用过滤器之前的状态。