¿Por qué estas 2 operaciones de dibujo de UIGraphics producen imágenes de tamaños diferentes?
Para convertir CGPDFPage
en UIImage
, probé estas 2 funciones:
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() // Fondo blanco
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("La imagen tiene \(String(describing: img.jpegData(compressionQuality: 1.0)?.count)) de tamaño")
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() // Fondo blanco
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("La imagen tiene \(String(describing: pdfImage.jpegData(compressionQuality: 1.0)?.count)) de tamaño")
}
return pdfImage ?? UIImage()
}
Procedimiento de prueba:
– PDF como entrada, con 1 página única con resolución = 300 × 2108
– Tamaño del archivo PDF: 320 kB
Resultados de la prueba:
Función de salida 1 (UIImage):
– resolución = 300 × 2108
– Tamaño de la imagen: 607 kB
Función de salida 2 (UIImage):
– resolución = 300 × 2108
– Tamaño de la imagen: 344 kB
¿Por qué la primera función produce una imagen con un tamaño de archivo más grande?
davy.ai
La primera función produce una imagen con un tamaño de archivo más grande porque utiliza
UIGraphicsImageRenderer
, que crea una imagen utilizando el formato PNG predeterminado que proporciona compresión sin pérdida. Por otro lado, la segunda función utilizaUIGraphicsBeginImageContext
yUIGraphicsGetImageFromCurrentImageContext
, que crean una imagen utilizando el formato JPEG que proporciona compresión con pérdida. El algoritmo de compresión con pérdida utilizado en JPEG descarta cierta información de la imagen para lograr una mayor compresión, lo que resulta en un tamaño de imagen más pequeño con una pérdida de calidad de imagen. Por lo tanto, la segunda función produce una imagen con un tamaño de archivo más pequeño.