Высокое качество UIImage из PDF
Я конвертирую 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;
Ответы
Ответ 1
Когда вы запрашиваете PDF файл для этого размера страницы, вы получаете ширину/высоту для 72 PPI. Вы можете попытаться создать контекст, который масштабируется с использованием масштабного преобразования. Например, если вы хотите выполнить рендеринг с разрешением 300 точек на дюйм, добавьте масштабный масштаб в шкалу 300.0/72.0
.
Если вы экспортируете как TIFF, вы сможете инкапсулировать окончательный PPI (300) сгенерированного изображения.
Ответ 2
Попробуйте этот код для Swift 3:
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
}
Это дает гораздо более высокое разрешение
Ответ 3
Это дает лучшее качество... если вам нужно другое качество, просто измените 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
}
Ответ 4
Я написал удобную категорию рендеринга PDF UIImage, которую вы можете найти полезной. Он также кэширует все полученные результаты для высокой производительности.
https://github.com/mindbrix/UIImage-PDF
Ответ 5
import PDFKit
let pdfDocument = PDFDocument(url: pdfUrl)!
let thumb = pdfDocument.page(at: pageIndex)?.thumbnail(of: size, for: .mediaBox)
Ответ 6
Начиная с iOS 13 и macOS 10.15 вы можете использовать thumbnailOfSize: forBox: