我的应用程序需要从磁盘读取JPEG文件,将其裁剪到已知区域,然后使用其他文件名保存。我当前的实现看起来像这样:
// open and crop the image
let image = CIImage(contentsOf: imagePath)
let cropRect = CGRect(x: 100, y: 100, width: 100, height: 100)
let croppedImage = image.cropped(to: cropRect)
// write to disk
let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)
let context = CIContext()
context.writeJPEGRepresentation(of: croppedImage, to: destination, colorSpace: colorSpace, options: [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 1])
我发现,即使我通过裁切边缘来缩小图像的尺寸,保存的文件仍是原始文件的两倍。我认为这是因为我正在对其重采样以另存为新的JPEG。我还注意到图像略有不同-可能不那么清晰。我当然可以调整压缩质量以减小文件大小,但这又会影响图像质量。
是否有某种方法可以在不增加文件大小或不改变其任何其他特征的情况下裁剪已压缩的jpeg文件?
答案 0 :(得分:1)
您的方法看起来正确。由于JPEG压缩的性质,如果不对图像进行解码和重新编码,就无法“裁剪”图像。
较大的文件大小应取决于您选择的压缩质量。引用文档:
如果目标格式支持[…]
,则值1.0指定使用无损压缩。
具有1.0质量的JPEG图像通常大于PNG图像。以我的经验,介于0.7和0.85之间的值会产生良好的质量与尺寸的平衡。