2009-11-20 123 views
0

我有一個jpeg圖像,我希望能夠使用Cocoa/Core Image/Core Graphics逐漸壓縮它。例如,我有A.jpg(3MB),我壓縮A並獲得B.jpg(1MB),壓縮B並獲得C.jpg(400KB),直到圖像不能再被壓縮。如何壓縮jpeg圖像與可可?

我想使用NSBitmapImageRep representationUsingType:屬性沒有太大的成功。我使用從壓縮圖像數據創建的圖像代表來嘗試和進一步壓縮,但如果使用與用於創建初始壓縮數據相同因子的壓縮因子,則這種方法效果不佳。

這裏是我一直在爭吵與

 
NSString * fileName = @"largeImage.jpg"; 

NSLog(@"== Initializing ==\n"); 

NSData * imageData = [NSData dataWithContentsOfFile:fileName]; 
NSLog(@"imageData length: %d\n", [imageData length]); 

NSImage * image = [[NSImage alloc] initWithData:imageData]; 
NSBitmapImageRep * bitmapRep = [[image representations] objectAtIndex:0]; 

NSData * data = [bitmapRep representationUsingType:NSJPEGFileType properties:nil]; 
NSLog(@"data length: %d\n", [data length]); 

NSDictionary * dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor]; 
NSData * data5 = [bitmapRep representationUsingType:NSJPEGFileType properties:dict]; 
NSLog(@"data5 length: %d\n", [data5 length]); 

NSLog(@"== End ==\n\n"); 

NSLog(@"== Image from Data5 ==\n"); 
NSImage * imageFromData5 = [[NSImage alloc] initWithData:data5]; 
NSBitmapImageRep * bitmapRepFromData5 = [[imageFromData5 representations] objectAtIndex:0]; 

NSData * dataFromImageFromData5 = [bitmapRepFromData5 representationUsingType:NSJPEGFileType properties:nil]; 
NSLog(@"dataFromImageFromData5 length: %d\n", [dataFromImageFromData5 length]); 

dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor]; 
NSData * dataFiveFromImageWithData5 = [bitmapRepFromData5 representationUsingType:NSJPEGFileType properties:dict]; 
NSLog(@"dataFiveFromImageWithData5 length: %d\n", [dataFiveFromImageWithData5 length]); 
NSLog(@"== End ==\n\n"); 

代碼這是我的結果

 
> == Initializing == 
> imageData length: 1882694 
> data length: 1888365 
> data5 length: 1102461 
> == End == 

> == Image from Data5 == 
> dataFromImageFromData5 length: 1646137 
> dataFiveFromImageWithData5 length: 1102115 
> == End == 


Try a different image 
> == Initializing == 
> imageData length: 3620257 
> data length: 2889458 
> data5 length: 1404750 
> == End == 

> == Image from Data5 == 
> dataFromImageFromData5 length: 2007951 
> dataFiveFromImageWithData5 length: 1405398 
> == End == 

回答

4

你需要每一次降低的因素。重新壓縮尚未編輯的JPEG圖像,使用相同的質量水平實際上不會改變結果,這應該解釋爲什麼您看不到任何尺寸縮小。

(如果您想確保質量不會降低得超過必要,可以使用遞減因子反覆重印原始圖像,而不是像您的示例中那樣鏈接它們。)