Уменьшите размер UIImage, сделав его в оттенках серого

Я генерирую PDF с 10 до 15 изображений, которые сделал пользователь. Изображения являются фотографиями документов и не должны быть цветными. Если я просто использую UIImages пользователь взял и использует очень высокую степень сжатия

UIImageJPEGRepresentation(image, 0.02)

PDF около 3MB (Ведьма цветные изображения) на iPhone6.

Чтобы еще больше уменьшить размер файла, я бы хотел преобразовать все изображения в истинные оттенки серого (я хочу выбросить информацию о цвете). Я также нашел это на GitHub

Обратите внимание, что iOS/macOS не поддерживают оттенки серого с альфа-каналом (для получения этого эффекта необходимо использовать изображение RGB со всеми тремя, установленными на одно и то же значение + альфа).

Я конвертирую изображения в оттенки серого следующим образом:

guard let cgImage = self.cgImage else {
    return self
}

let height = self.size.height
let width = self.size.width
let colorSpace = CGColorSpaceCreateDeviceGray();
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)
let context = CGContext.init(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!
let rect = CGRect(x: 0, y: 0, width: width, height: height)

context.draw(cgImage, in: rect)
guard let grayscaleImage = context.makeImage() else {
   return self
}
return UIImage(cgImage: grayscaleImage)

Тем не менее, когда я пытаюсь сжать полученные изображения снова с

UIImageJPEGRepresentation(image, 0.02)

Я получаю взволнованные журналы:

JPEGDecompressSurface: Ошибка декодирования изображения: e00002c2

и изображения отображаются искаженными. Любые идеи о том, как я могу получить маленькое истинное изображение в градациях серого?

0 ответов

Другие вопросы по тегам