为了将CGPDFPage
转换为UIImage
,我测试了这两个函数:
private func convertToImg(page: CGPDFPage) -> UIImage {
let pageRect = page.getBoxRect(.mediaBox)
let format = UIGraphicsImageRendererFormat()
format.scale = 1 // Set scale to 1 to prevent image to be drawn bigger than the original
let renderer = UIGraphicsImageRenderer(size: pageRect.size, format: format)
let img = renderer.image { ctx in
UIColor.white.set() // White Background
ctx.fill(pageRect)
ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
ctx.cgContext.drawPDFPage(page)
}
DLog("Image has (String(describing: img.jpegData(compressionQuality: 1.0)?.count)) size")
return img
}
private func convertToImg2(page: CGPDFPage) -> UIImage {
let pageRect = page.getBoxRect(.mediaBox)
UIGraphicsBeginImageContext(pageRect.size)
let context:CGContext = UIGraphicsGetCurrentContext()!
context.saveGState()
UIColor.white.set() // White Background
context.fill(pageRect)
context.translateBy(x: 0.0, y: pageRect.size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.concatenate(page.getDrawingTransform(.mediaBox, rect: pageRect, rotate: 0, preserveAspectRatio: true))
context.drawPDFPage(page)
context.restoreGState()
let pdfImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if let pdfImage = pdfImage {
DLog("Image has (String(describing: pdfImage.jpegData(compressionQuality: 1.0)?.count)) size")
}
return pdfImage ?? UIImage()
}
测试程序:
- PDF 作为输入,1 个单页,分辨率 = 300 × 2108
- PDF 文件大小: 320kB
测试结果:
输出函数 1 (UIImage):
- 分辨率 = 300 × 2108
- 图像大小:607kB
输出函数 2 (UIImage):
- 分辨率 = 300 × 2108
- 图像大小: 344 kB
为什么第一个函数输出的文件更大
?找到了。诀窍是设置format.preferredRange = .standard
其中format
属于类UIGraphicsImageRendererFormat
它限制了使用的颜色范围,因此限制了输出文件大小。