JPEG 画像があり、Cocoa/Core Image/Core Graphics を使用して段階的に圧縮できるようにしたいと考えています。たとえば、A.jpg (3MB) があり、A を圧縮して B.jpg (1MB) を取得し、B を圧縮して C.jpg (400KB) を取得し、画像が圧縮できなくなるまで繰り返します。
私は NSBitmapImageReppresentationUsingType:properties を使用しようとしていますが、あまり成功していません。圧縮された画像データから作成された画像表現を使用してさらに圧縮しようとしましたが、最初の圧縮データの作成に使用したのと同じ圧縮係数を使用すると、うまくいきません。
ここに私が苦労しているコードがあります
NSString * fileName = @"largeImage.jpg"; NSLog(@"== 初期化中 ==\n"); NSData * imageData = [NSData dataWithContentsOfFile:fileName]; NSLog(@"imageData の長さ: %d\n", [imageData の長さ]); NSImage * image = [[NSImage alloc] initWithData:imageData]; NSBitmapImageRep * bitmapRep = [[画像表現] objectAtIndex:0]; NSData * データ = [bitmapRep 表現UsingType:NSJPEGFileType プロパティ:nil]; NSLog(@"データ長: %d\n", [データ長]); NSDictionary * dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor]; NSData * data5 = [bitmapRep 表現UsingType:NSJPEGFileType プロパティ:dict]; NSLog(@"data5 の長さ: %d\n", [data5 の長さ]); NSLog(@"== 終了 ==\n\n"); NSLog(@"== Data5 からの画像 ==\n"); NSImage * imageFromData5 = [[NSImage alloc] initWithData:data5]; NSBitmapImageRep * bitmapRepFromData5 = [[imageFromData5 表現] objectAtIndex:0]; NSData * dataFromImageFromData5 = [bitmapRepFromData5 表現UsingType:NSJPEGFileType プロパティ:nil]; NSLog(@"dataFromImageFromData5 長さ: %d\n", [dataFromImageFromData5 長さ]); dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor]; NSData * dataFiveFromImageWithData5 = [bitmapRepFromData5 表現UsingType:NSJPEGFileType プロパティ:dict]; NSLog(@"dataFiveFromImageWithData5 長さ: %d\n", [dataFiveFromImageWithData5 長さ]); NSLog(@"== 終了 ==\n\n");
これが私の結果です
> == 初期化中 == > 画像データの長さ: 1882694 > データ長: 1888365 > data5 の長さ: 1102461 > == 終了 == > == Data5 からの画像 == > dataFromImageFromData5 長さ: 1646137 > dataFiveFromImageWithData5 長さ: 1102115 > == 終了 == 別の画像を試す > == 初期化中 == > 画像データの長さ: 3620257 > データ長: 2889458 > data5 の長さ: 1404750 > == 終了 == > == Data5 からの画像 == > dataFromImageFromData5 長さ: 2007951 > dataFiveFromImageWithData5 長さ: 1405398 > == 終了 ==