1

I'm generating a PDF with 10 to 15 images the user has taken. The images are photos of documents and don't need to be colored. If I simply use the UIImages the user has taken, and use a very high compression rate

UIImageJPEGRepresentation(image, 0.02)

the PDF is about 3MB (witch colored images) on an iPhone6.

To further reduce the file size, I would now like to convert all images to true grayscale (I do want to throw the color information away). I also found this on github

Note that iOS/macOS do not support gray scale with alpha (you have to use a RGB image with all 3 set to the same value + alpha to get this affect).

I'm converting the images to grayscale like so:

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)

However, when I try to compress the resulting images again with

UIImageJPEGRepresentation(image, 0.02)

I get the flollowing logs:

JPEGDecompressSurface : Picture decode failed: e00002c2

and the images are displayed distorted. Any ideas on how I can get small true grayscale image?

rmaddy
  • 314,917
  • 42
  • 532
  • 579
productioncoder
  • 4,225
  • 2
  • 39
  • 65

0 Answers0