Dr.Kameleon
Dr.Kameleon

Reputation: 22820

How to compress a PNG image using Cocoa?

So, this is what I need :

In the past, I tried using OptiPNG - as compiled binary (and getting results asynchronously) - which worked.

However, what if I don't want a terminal-like solution with external apps, but something more Cocoa-native?

Any ideas?

Upvotes: 3

Views: 1062

Answers (1)

Alex
Alex

Reputation: 89

NSImage* image; // your NSImage

// With compression
NSData* data = [image
                TIFFRepresentationUsingCompression:NSTIFFCompressionLZW
                factor:0.5f]; // you can change factor between 0 and 1.0 for preferred compression rate

if (data != nil) {
    NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithData:data];
    if (bitmap != nil) {
        NSData* bitmapData = [bitmap
                              representationUsingType:NSBitmapImageFileTypePNG
                              properties:@{}];
        if (bitmapData != nil) {
            [bitmapData
             writeToFile:<file_path> //path where to save png
             atomically:true];
        }
    }
}

Update: As mentioned in comments, this does not compress png.
However I have used this code in ShareExtension and it compress received screenshots well (from 1.1-1.5MB if save in plain to 0.4-0.7MB using representationUsingType) and without quality loss, just like OP asked.

Upvotes: -1

Related Questions