Swift - 单元测试中不同 iOS 中的不同 pngData() 大小
Swift - Different pngData() sizes in different iOS in unit tests
我正在使用单元测试在我的 Swift 项目中测试图像的旋转。
当我使用 iOS 13.7 进行测试时,我得到的结果与 pngData()
不同,而当我使用 iOS 11.2.
进行测试时,我得到了不同的结果
也很奇怪,我认为这是相关的,而且我真正的问题是 -
关于 iOS 13.7 比较 2 个图像 - 静态图像和旋转图像 - return 它们的数据大小相同。
在 iOS 11.2 - 我的静态图像将其数据大小更改了 X AMOUNT,我的旋转图像将其数据大小更改了 Y AMOUNT,现在它们具有不同的数据大小,我的测试失败了。
旋转函数 -
func cld_rotate(_ degree: Float) -> UIImage? {
var newSize = CGRect(origin: CGPoint.zero, size: self.size).applying(CGAffineTransform(rotationAngle: cld_radians(from: Double(degree)))).size
// Trim off the extremely small float value to prevent core graphics from rounding it up
newSize.width = floor(newSize.width)
newSize.height = floor(newSize.height)
UIGraphicsBeginImageContextWithOptions(newSize, false, self.scale)
let context = UIGraphicsGetCurrentContext()!
// Move origin to middle
context.translateBy(x: newSize.width/2, y: newSize.height/2)
// Rotate around middle
context.rotate(by: cld_radians(from: Double(degree)))
// Draw the image at its center
draw(in: CGRect(x: -self.size.width/2, y: -self.size.height/2, width: self.size.width, height: self.size.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
知道为什么 pngData()
在 2 个不同的 iOS 中使用的不一样吗?以及为什么旋转后的图像改变其数据大小的量与静态图像不同?
PNG 图像被压缩。旋转图像可能需要重新压缩,这可能会产生不同的输出。我希望文件大小会略有变化,因为压缩算法可以根据不同的输入数据产生不同的文件大小。 (我原来是说PNG图片使用有损压缩,但我错了。)
对我来说,问题是 iOS 13.7 如何在旋转时保持文件大小。我想知道它是否能够识别 90 度旋转并以某种方式转换压缩图像数据,而 iOS 11.2 无法做到这一点? (我的猜测是图像 compression/decompression 算法在 iOS 11.2 和 iOS 13.7 之间变得更智能,现在它能够识别 90 度旋转并在数据上使用算法而无需解压缩并重新压缩图像。)
我不确定你说的静态图像是什么。你是说你把PNG图片打开成UIImage,然后不做转换就导出回PNG?
我正在使用单元测试在我的 Swift 项目中测试图像的旋转。
当我使用 iOS 13.7 进行测试时,我得到的结果与 pngData()
不同,而当我使用 iOS 11.2.
也很奇怪,我认为这是相关的,而且我真正的问题是 -
关于 iOS 13.7 比较 2 个图像 - 静态图像和旋转图像 - return 它们的数据大小相同。
在 iOS 11.2 - 我的静态图像将其数据大小更改了 X AMOUNT,我的旋转图像将其数据大小更改了 Y AMOUNT,现在它们具有不同的数据大小,我的测试失败了。
旋转函数 -
func cld_rotate(_ degree: Float) -> UIImage? {
var newSize = CGRect(origin: CGPoint.zero, size: self.size).applying(CGAffineTransform(rotationAngle: cld_radians(from: Double(degree)))).size
// Trim off the extremely small float value to prevent core graphics from rounding it up
newSize.width = floor(newSize.width)
newSize.height = floor(newSize.height)
UIGraphicsBeginImageContextWithOptions(newSize, false, self.scale)
let context = UIGraphicsGetCurrentContext()!
// Move origin to middle
context.translateBy(x: newSize.width/2, y: newSize.height/2)
// Rotate around middle
context.rotate(by: cld_radians(from: Double(degree)))
// Draw the image at its center
draw(in: CGRect(x: -self.size.width/2, y: -self.size.height/2, width: self.size.width, height: self.size.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
知道为什么 pngData()
在 2 个不同的 iOS 中使用的不一样吗?以及为什么旋转后的图像改变其数据大小的量与静态图像不同?
PNG 图像被压缩。旋转图像可能需要重新压缩,这可能会产生不同的输出。我希望文件大小会略有变化,因为压缩算法可以根据不同的输入数据产生不同的文件大小。 (我原来是说PNG图片使用有损压缩,但我错了。)
对我来说,问题是 iOS 13.7 如何在旋转时保持文件大小。我想知道它是否能够识别 90 度旋转并以某种方式转换压缩图像数据,而 iOS 11.2 无法做到这一点? (我的猜测是图像 compression/decompression 算法在 iOS 11.2 和 iOS 13.7 之间变得更智能,现在它能够识别 90 度旋转并在数据上使用算法而无需解压缩并重新压缩图像。)
我不确定你说的静态图像是什么。你是说你把PNG图片打开成UIImage,然后不做转换就导出回PNG?