es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  ,

Answer

  1. Avatar for 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 utiliza UIGraphicsBeginImageContext y UIGraphicsGetImageFromCurrentImageContext, 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.

Comments are closed.