У меня есть конвейер iOS, который создает четкие бинаризованные изображения в оттенках серого (Otsu/адаптивный; небольшой контраст/гамма). Сохранение PNG/JPEG выглядит великолепно. Но при встраивании того же растра в PDF тонкий текст приобретает неровности или «белые дыры», особенно при масштабировании 100–150 % (Preview/PDFKit).
iOS 17, Swift 5.9. Только растр (без векторного текста). PDF через UIGraphicsPDFRenderer и Core Graphics.
Минимальный код:
Код: Выделить всё
func pageSizePts(pixels: CGSize, dpi: CGFloat) -> CGSize {
CGSize(width: pixels.width * 72/dpi, height: pixels.height * 72/dpi)
}
func makePDF(from img: CGImage, dpi: CGFloat = 300, to url: URL) throws {
let size = pageSizePts(pixels: .init(width: img.width, height: img.height), dpi: dpi)
let renderer = UIGraphicsPDFRenderer(bounds: .init(origin: .zero, size: size))
try renderer.writePDF(to: url) { ctx in
ctx.beginPage()
let cg = UIGraphicsGetCurrentContext()!
cg.interpolationQuality = .none
cg.setShouldAntialias(false)
cg.draw(img, in: .init(origin: .zero, size: size)) // 1:1 at chosen DPI
}
}
- vs .high интерполяция; включение/выключение сглаживания
Код: Выделить всё
.none - Предварительное масштабирование с помощью vImage (повторная выборка HQ) до точного целевого размера.
- Оттенки серого, 8 бит против явного 1-битного CGImage (надеюсь на CCITT)
- Базовая графика PDF с kCGPDFContextCompressionLevel 0–9
- Как встроить растровые страницы в PDF без скрытого повторного сжатия/повторной выборки на iOS? Могу ли я принудительно использовать Flate (8 бит) или CCITT G4 (1 бит) вместо JPEG?
- Достаточно ли моего отображения 1:1 () или есть ли другой способ избежать размытия при просмотре?
Код: Выделить всё
points = pixels * 72/dpi - Известные особенности просмотра PDF-файлов в macOS/iOS, которые вызывают появление таких «дыр», и рекомендуемые меры по их устранению?
Подробнее здесь: https://stackoverflow.com/questions/798 ... gets-holes
Мобильная версия