15

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 オリジナルPDF


PDFからの画像 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;
4

6 に答える 6

6

PDFにページサイズを尋ねると、72PPIの幅/高さが得られます。スケール変換を使用してスケールアップされたコンテキストを作成してみてください。たとえば、300 dpiでレンダリングする場合は、スケール変換を追加して。でスケールし300.0/72.0ます。

TIFFとしてエクスポートすると、生成された画像の最終的なPPI(300)をカプセル化できます。

于 2013-01-04T06:53:58.710 に答える
6

これは最高の品質を提供します...別の品質が必要な場合は、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
}
于 2017-05-28T13:46:09.767 に答える
3

Swift3でこのコードを試してください:

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 pageRect = page.getBoxRect(.mediaBox)
    let renderer = UIGraphicsImageRenderer(size: pageRect.size)
    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);
        cnv.cgContext.scaleBy(x: 1.0, y: -1.0);
        cnv.cgContext.drawPDFPage(page);
    })
    let img2 = UIImage(data: img1)
    return img2
}

これにより、はるかに高い解像度が得られます

于 2016-12-16T10:54:37.703 に答える
2

便利なUIImagePDFレンダラーカテゴリを作成しました。また、レンダリングされたすべての結果をキャッシュして、パフォーマンスを向上させます。

https://github.com/mindbrix/UIImage-PDF

于 2013-01-10T11:43:07.667 に答える
2
import PDFKit

let pdfDocument = PDFDocument(url: pdfUrl)!
let thumb = pdfDocument.page(at: pageIndex)?.thumbnail(of: size, for: .mediaBox)
于 2019-04-06T14:02:49.910 に答える
2

iOS 11.0、macOS 10.13、Mac Catalyst 13.0以降、thumbnailOfSize:forBoxを使用できます。

于 2019-10-09T13:26:22.387 に答える