确保图像数据在 Swift 中的 iOS 应用程序上正确定向 5
Ensuring Image Data is correctly oriented on iOS App in Swift 5
我正在使用 Firebase ML Kit 进行人脸检测,在文档中它说:
If necessary, rotate the image so that its imageOrientation property is .up.
Create a VisionImage object using the correctly-rotated UIImage.
Do not specify any rotation metadata—the default value, .topLeft, must be used.
我 运行 遇到以下问题:我从 Internet 上传的照片往往可以正常工作,但当我用相机拍摄照片时似乎出现了问题。我有一种感觉,这是由于图像的定向方式所致,我不知道应该如何检查图像以确保满足上面列出的这两个要求。我尝试打印出 images.imageOrientation 但它对我帮助不大,而且出于某种原因我无法使用我在不同的 Whosebug 答案中看到的 UIImageOrientationUp
。
这是我尝试打印图像方向时打印的内容:
int:0x2809f9a40 'UISV-alignment' UIImageView:0x13de4d4b0.bottom == UILabel:0x13dec1630'orient's Profile'.bottom (active)>",
"<NSLayoutConstraint:0x2809f9a90 'UISV-alignment' UIImageView:0x13de4d4b0.top == UILabel:0x13dec1630'orient's Profile'.top (active)>",
无论如何,如果有人能帮我写一个函数,我可以用它来确保我即将传递给 ML Kit 的图像的方向是正确的,我将非常感激。谢谢!我是 iOS 新手,这是我的第一个 "Real" 应用程序,所以如果有更好或更简单的方法来实现我的目标,我很抱歉。
*** 所以我发现当我用我的相机拍照时它是朝向 .right 但它在实际的 imageView 上看起来很好。我尝试将方向更改为 .up 但现在图像实际上向右旋转并且检测仍然失败......我想我需要将方向更改为 .Up 而不实际旋转图像(如果可能的话)。因为当我尝试设置值时,它说它只获取 属性
感谢您联系我们,我是 MLKit 团队的 Julie,很抱歉来晚了。
是的,当从相机拍摄照片时,默认方向并不总是 .up
,例如,如果以人像模式拍摄,image.orientation 的方向是 .right
。
人脸检测器在处理方向不是.up
的图像时实际上非常灵活,关键步骤是正确设置方向:
下面是一个使用我们 quickstart app 中的相机拍摄的照片检测人脸的示例,看看它是否能解决您的问题。
基本上你只需要像this一样正确设置imageMetadata.orientation
值:
// Define the metadata for the image.
let imageMetadata = VisionImageMetadata()
imageMetadata.orientation = UIUtilities.visionImageOrientation(from: image.imageOrientation)
// Initialize a VisionImage object with the given UIImage.
let visionImage = VisionImage(image: image)
visionImage.metadata = imageMetadata
并且可以找到方向之间的映射here:
public static func visionImageOrientation(
from imageOrientation: UIImage.Orientation
) -> VisionDetectorImageOrientation {
switch imageOrientation {
case .up:
return .topLeft
case .down:
return .bottomRight
case .left:
return .leftBottom
case .right:
return .rightTop
case .upMirrored:
return .topRight
case .downMirrored:
return .bottomLeft
case .leftMirrored:
return .leftTop
case .rightMirrored:
return .rightBottom
}
}
此 UIImage 声明适用于所有 ML Kit 检测器的更通用目的:
Create a VisionImage object using the correctly-rotated UIImage. Do not specify any rotation metadata—the default value, .topLeft, must be used.
但对于人脸,只需正确设置方向即可轻量级处理。对于给您带来的困惑,我们深表歉意,我们将在下一个版本中更新此声明。
感谢您报告问题,希望快速入门应用对您的开发有所帮助。
干杯,
朱莉
我正在使用 Firebase ML Kit 进行人脸检测,在文档中它说:
If necessary, rotate the image so that its imageOrientation property is .up. Create a VisionImage object using the correctly-rotated UIImage. Do not specify any rotation metadata—the default value, .topLeft, must be used.
我 运行 遇到以下问题:我从 Internet 上传的照片往往可以正常工作,但当我用相机拍摄照片时似乎出现了问题。我有一种感觉,这是由于图像的定向方式所致,我不知道应该如何检查图像以确保满足上面列出的这两个要求。我尝试打印出 images.imageOrientation 但它对我帮助不大,而且出于某种原因我无法使用我在不同的 Whosebug 答案中看到的 UIImageOrientationUp
。
这是我尝试打印图像方向时打印的内容:
int:0x2809f9a40 'UISV-alignment' UIImageView:0x13de4d4b0.bottom == UILabel:0x13dec1630'orient's Profile'.bottom (active)>",
"<NSLayoutConstraint:0x2809f9a90 'UISV-alignment' UIImageView:0x13de4d4b0.top == UILabel:0x13dec1630'orient's Profile'.top (active)>",
无论如何,如果有人能帮我写一个函数,我可以用它来确保我即将传递给 ML Kit 的图像的方向是正确的,我将非常感激。谢谢!我是 iOS 新手,这是我的第一个 "Real" 应用程序,所以如果有更好或更简单的方法来实现我的目标,我很抱歉。
*** 所以我发现当我用我的相机拍照时它是朝向 .right 但它在实际的 imageView 上看起来很好。我尝试将方向更改为 .up 但现在图像实际上向右旋转并且检测仍然失败......我想我需要将方向更改为 .Up 而不实际旋转图像(如果可能的话)。因为当我尝试设置值时,它说它只获取 属性
感谢您联系我们,我是 MLKit 团队的 Julie,很抱歉来晚了。
是的,当从相机拍摄照片时,默认方向并不总是 .up
,例如,如果以人像模式拍摄,image.orientation 的方向是 .right
。
人脸检测器在处理方向不是.up
的图像时实际上非常灵活,关键步骤是正确设置方向:
下面是一个使用我们 quickstart app 中的相机拍摄的照片检测人脸的示例,看看它是否能解决您的问题。
基本上你只需要像this一样正确设置imageMetadata.orientation
值:
// Define the metadata for the image.
let imageMetadata = VisionImageMetadata()
imageMetadata.orientation = UIUtilities.visionImageOrientation(from: image.imageOrientation)
// Initialize a VisionImage object with the given UIImage.
let visionImage = VisionImage(image: image)
visionImage.metadata = imageMetadata
并且可以找到方向之间的映射here:
public static func visionImageOrientation(
from imageOrientation: UIImage.Orientation
) -> VisionDetectorImageOrientation {
switch imageOrientation {
case .up:
return .topLeft
case .down:
return .bottomRight
case .left:
return .leftBottom
case .right:
return .rightTop
case .upMirrored:
return .topRight
case .downMirrored:
return .bottomLeft
case .leftMirrored:
return .leftTop
case .rightMirrored:
return .rightBottom
}
}
此 UIImage 声明适用于所有 ML Kit 检测器的更通用目的:
Create a VisionImage object using the correctly-rotated UIImage. Do not specify any rotation metadata—the default value, .topLeft, must be used.
但对于人脸,只需正确设置方向即可轻量级处理。对于给您带来的困惑,我们深表歉意,我们将在下一个版本中更新此声明。
感谢您报告问题,希望快速入门应用对您的开发有所帮助。
干杯,
朱莉