为什么这两个 UIGraphics 绘图操作会产生不同大小的图像?



为了将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

它限制了使用的颜色范围,因此限制了输出文件大小。

最新更新