Уменьшите размер 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

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


person productioncoder    schedule 21.10.2017    source источник
comment
stackoverflow.com/a/43011878/2303865   -  person Leo Dabus    schedule 21.10.2017
comment
Обратите внимание, что при использовании CIImage вам необходимо перерисовать изображение, прежде чем пытаться преобразовать UIImage в JPEG или PNG, иначе он вернет ноль.   -  person Leo Dabus    schedule 21.10.2017