2

ここに私がこれまでに持っているものがあります:

NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:
               [file.image TIFFRepresentation]];
// Resize image to 200x200
CGFloat maxSize = 200.0;
NSSize imageSize = imageRep.size;
if (imageSize.height>maxSize || imageSize.width>maxSize) {
    // Find the aspect ratio
    CGFloat aspectRatio = imageSize.height/imageSize.width;
    CGSize newImageSize;
    if (aspectRatio > 1.0) {
        newImageSize = CGSizeMake(maxSize / aspectRatio, maxSize);
    } else if (aspectRatio < 1.0) {
        newImageSize = CGSizeMake(maxSize, maxSize * aspectRatio);
    } else {
        newImageSize = CGSizeMake(maxSize, maxSize);
    }
    [imageRep setSize:NSSizeFromCGSize(newImageSize)];
}


NSData *imageData = [imageRep representationUsingType:NSPNGFileType properties:nil];
NSString *outputFilePath = [@"~/Desktop/output.png" stringByExpandingTildeInPath];
[imageData writeToFile:outputFilePath atomically:NO];

このコードは、200x200 の PNG が 128K 未満であることを前提としています。これが私のサイズ制限です。200x200 で十分ですが、可能であれば最大サイズにしたいと思います。

ここに私の2つの問題があります:

  1. コードが機能しません。書き出されたファイルのサイズを確認すると、元のファイルと同じサイズです。
  2. エクスポートする前に出力ファイルのサイズを予測して、サイズを最大にしても 128K 未満の画像を取得する方法はありますか?

これが作業コードです。かなりずさんで、おそらくいくつかの最適化を使用することができますが、現時点では気にしないほど高速に実行されます。ほとんどの写真で 100 倍以上反復し、ミリ秒単位で終了します。また、このメソッドは のカテゴリで宣言されていますNSImage

- (NSData *)resizeImageWithBitSize:(NSInteger)size 
                      andImageType:(NSBitmapImageFileType)fileType {

    CGFloat maxSize = 500.0;
    NSSize originalImageSize = self.size;
    NSSize newImageSize;
    NSData *returnImageData;
    NSInteger imageIsTooBig = 1000;

    while (imageIsTooBig > 0) {
            if (originalImageSize.height>maxSize || originalImageSize.width>maxSize) {
            // Find the aspect ratio
            CGFloat aspectRatio = originalImageSize.height/originalImageSize.width;
            if (aspectRatio > 1.0) {
                newImageSize = NSMakeSize(maxSize / aspectRatio, maxSize);
            } else if (aspectRatio < 1.0) {
                newImageSize = NSMakeSize(maxSize, maxSize * aspectRatio);
            } else {
                newImageSize = NSMakeSize(maxSize, maxSize);
            }
        } else {
            newImageSize = originalImageSize;
        }

        NSImage *resizedImage = [[NSImage alloc] initWithSize:newImageSize];

        [resizedImage lockFocus];
        [self drawInRect:NSMakeRect(0, 0, newImageSize.width, newImageSize.height)
                fromRect: NSMakeRect(0, 0, originalImageSize.width, originalImageSize.height) 
               operation: NSCompositeSourceOver 
                fraction: 1.0];
        [resizedImage unlockFocus];

        NSData *tiffData = [resizedImage TIFFRepresentation];
        [resizedImage release];

        NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:tiffData];
        NSDictionary *imagePropDict = [NSDictionary 
                                       dictionaryWithObject:[NSNumber numberWithFloat:0.85] 
                                                     forKey:NSImageCompressionFactor];

        returnImageData = [imageRep representationUsingType:fileType properties:imagePropDict];
        [imageRep release];

        if ([returnImageData length] > size) {
            maxSize = maxSize * 0.99;
            imageIsTooBig--;
        } else {
            imageIsTooBig = 0;
        }

    }

    return returnImageData;
}
4

2 に答える 2

0

[imageData length]NSData のコンテンツの長さがわかるはずです。これは、ディスクに書き込まれたときの最終的なファイル サイズであると理解しています。これにより、実際に書き込む前にファイルのサイズを最大化する機会が得られます。

setSize のドキュメントによると、画像が縮小または拡大していない理由については、次のとおりです。

画像データの物理的な寸法と組み合わされた画像表現のサイズによって、画像の解像度が決まります。

したがって、サイズを設定し、解像度を変更しないことで、ピクセルを変更していない可能性があります。ピクセルが解釈される方法だけです。

于 2009-10-13T22:59:51.980 に答える