iphone - 来自 PDF 的高质量 UIImage

标签 iphone objective-c

我正在将 PDF 页面转换为 UIImage。在这样做的同时,我失去了图像质量。在获得高质量图像方面需要帮助。

生成UIImage的代码

-(UIImage *)imageForPage:(int)pageNumber {
    CGPDFPageRef pdfPageRef = [self pdfReferenceForPage:pageNumber];

    CGSize pageSize = [self sizeOfPage:pageNumber];

    //UIGraphicsBeginImageContext(pageSize);

    UIGraphicsBeginImageContextWithOptions(pageSize, NO, 0.0);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

    CGContextTranslateCTM(context, 0.0, pageSize.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSaveGState(context);

    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pdfPageRef, kCGPDFCropBox, CGRectMake(0, 0, pageSize.width, pageSize.height), 0, true);
    CGContextConcatCTM(context, pdfTransform);

    CGContextDrawPDFPage(context, pdfPageRef);
    CGContextRestoreGState(context);

    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return resultingImage;
}


- (void)saveImage {
       UIImage *image = [self imageForPage:1];
       [UIImageJPEGRepresentation(image, 1.0) writeToFile:filePath atomically:YES];
}

图像对比

原始 PDF Original PDF


PDF 图片 Image from PDF

------------

编辑:有变化的代码

float dpi = 100.0 / 72.0;

CGPDFPageRef pdfPageRef = [self pdfReferenceForPage:pageNumber];

CGSize pageSize = [self sizeOfPage:pageNumber];
pageSize.width = pageSize.width * dpi;
pageSize.height = pageSize.height * dpi;

UIGraphicsBeginImageContext(pageSize);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextTranslateCTM(context, 0.0, pageSize.height);
CGContextScaleCTM(context, dpi, -dpi);
CGContextSaveGState(context);
//CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pdfPageRef, kCGPDFCropBox, CGRectMake(0, 0, pageSize.width, pageSize.height), 0, true);
//CGContextConcatCTM(context, pdfTransform);
CGContextDrawPDFPage(context, pdfPageRef);
CGContextRestoreGState(context);

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return resultingImage;

最佳答案

这个质量最好...如果您需要其他质量,只需更改 dpi。

    func drawPDFfromURL(url: URL) -> UIImage? {
    guard let document = CGPDFDocument(url as CFURL) else { return nil }
    guard let page = document.page(at: 1) else { return nil }
    let dpi: CGFloat = 300.0 / 72.0
    let pageRect = page.getBoxRect(.mediaBox)

    let renderer = UIGraphicsImageRenderer(size: CGSize(width: pageRect.size.width * dpi, height: pageRect.size.height * dpi))

    let img1 = renderer.jpegData(withCompressionQuality: 1.0, actions: { cnv in
          UIColor.white.set()
          cnv.fill(pageRect)
          cnv.cgContext.translateBy(x: 0.0, y: pageRect.size.height * dpi);
          cnv.cgContext.scaleBy(x: dpi, y: -dpi);
          cnv.cgContext.drawPDFPage(page);

        })
    let img2 = UIImage(data: img1)
    return img2
}

关于iphone - 来自 PDF 的高质量 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152477/

相关文章:

ios - UIScrollview 下的 UIImageView 不适合顶部屏幕

objective-c - 在 objective-c 中定义常量

ios - 以编程方式关闭 iOS 屏幕

ios - 编码错误的响应

iphone - 基于 View 的应用程序? - 请解释

ios - 所有被 addObject 覆盖的对象 : when using NSXMLParser

iphone - 具有无限滚动和延迟加载的 UITableView

ios - 如何在 iOS 6 中显示表格部分标题?

iOS - 表格 View 字母过滤器中的画外音问题

ios - 尝试向 Core Data 添加新记录时出错