objective-ccocoansimageimage-rotationnsaffinetransform

Using NSAffineTransform to rotate NSImage results in a file twice the size


I'm using the following code to flip (rotate by 180 degrees) an NSImage. But the new image is twice the size (MBs, not dimensions) of the original when saved to disk. I want it to be approximately the same as the original. How can I accomplish this?

NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:[[_imageView image] TIFFRepresentation]];
NSImage *img = [[NSImage alloc] initWithSize:NSMakeSize(imageRep.pixelsWide, imageRep.pixelsHigh)];
[img lockFocus];
NSAffineTransform *rotator = [NSAffineTransform transform];
[rotator translateXBy:imageRep.pixelsWide yBy:imageRep.pixelsHigh];
[rotator scaleXBy:-1 yBy:-1];
[rotator concat];
[imageRep drawInRect:NSMakeRect(0, 0, imageRep.pixelsWide, imageRep.pixelsHigh)];
[img unlockFocus];

Code I'm using to save image to disk :

[[NSFileManager defaultManager] createFileAtPath:path contents:[img TIFFRepresentation] attributes:nil];

Thanks in advance!


Solution

  • I still don't know the root cause of this, but one work around is to save to the JPEG representation instead of the TIFF. The method I wrote is as follows :

    - (void)CompressAndSaveImg:(NSImage *)img ToDiskAt:(NSString *)path WithCompressionFactor:(float)value{
        NSData *imgData = [img TIFFRepresentation];
        NSBitmapImageRep *imgRep = [NSBitmapImageRep imageRepWithData:imgData];
        NSNumber *compressionFactor = [NSNumber numberWithFloat:value];
        NSDictionary *imageProps = [NSDictionary dictionaryWithObject:compressionFactor forKey:NSImageCompressionFactor];
        imgData = [imgRep representationUsingType:NSJPEGFileType properties:imageProps];
        [imgData writeToFile:path atomically:YES];
    }
    

    You can play around the with the WithCompressionFactor:(float)value parameter, but 0.75 works fine for me.