0

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
> == 終了 ==
4

1 に答える 1

4

毎回係数を減らす必要があります。同じ品質レベルを使用して、編集されていない JPEG 画像を再圧縮しても、実際には結果はまったく変わりません。

(品質が必要以上に低下しないようにしたい場合は、例のようにチェーンするのではなく、元の画像を減少させて何度も再圧縮するのが理にかなっています。)

于 2009-11-20T21:58:39.730 に答える