1

次のように仮定します。

  • iPadアプリでインターネットから画像をダウンロードします
  • 画像は好きなように後処理でき、かかる時間は重要ではありません (データのダウンロード時に 1 回の操作)。デバイス上の実際の表現も重要ではありません。
  • UIImageになる限り、その画像の読み込みコードを好きなように書くことができます

問題は、iPad に画像を保存し、読み込みにできるだけ時間がかからないようにするのに最適な形式は何ですか? CGのある種の生のダンプ...コンテキストビットマップメモリ​​?

4

1 に答える 1

0

その間に私はそれを理解したと思います:

UIImageを保存するために、このメソッドをカテゴリに追加しました。

typedef struct
{
    int width;
    int height;
    int scale;

    int bitsPerComponent;
    int bitsPerPixel;
    int bytesPerRow;
    CGBitmapInfo bitmapInfo;
} ImageInfo;

-(void)saveOptimizedRepresentation:(NSString *)outputPath
{
    NSData * pixelData = (__bridge_transfer NSData *)CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage));
    CGSize size;
    size.width = CGImageGetWidth(self.CGImage);
    size.height = CGImageGetHeight(self.CGImage);
    int bitsPerComponent = CGImageGetBitsPerComponent(self.CGImage);
    int bitsPerPixel = CGImageGetBitsPerPixel(self.CGImage);
    int bytesPerRow = CGImageGetBytesPerRow(self.CGImage);
    int scale = self.scale;
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(self.CGImage);

    ImageInfo info;
    info.width = size.width;
    info.height = size.height;
    info.bitsPerComponent = bitsPerComponent;
    info.bitsPerPixel = bitsPerPixel;
    info.bytesPerRow = bytesPerRow;
    info.bitmapInfo = bitmapInfo;
    info.scale = scale;

    //kCGColorSpaceGenericRGB
    NSMutableData * fileData = [NSMutableData new];

    [fileData appendBytes:&info length:sizeof(info)];
    [fileData appendData:pixelData];

    [fileData writeToFile:outputPath atomically:YES];
}

それをロードするために、私はこれを追加しました:

+(UIImage *)loadOptimizedRepresentation:(NSString *)inputPath
{
    FILE * f = fopen([inputPath cStringUsingEncoding:NSASCIIStringEncoding],"rb");
    if (!f) return nil;

    fseek(f, 0, SEEK_END);
    int length = ftell(f) - sizeof(ImageInfo);
    fseek(f, 0, SEEK_SET);

    ImageInfo info;
    fread(&info, 1, sizeof(ImageInfo), f);

    CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();

    CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
                                                       info.width,
                                                       info.height,
                                                       info.bitsPerComponent,
                                                       info.bytesPerRow,
                                                       cs,
                                                       info.bitmapInfo
                                                       );

    void * targetData = CGBitmapContextGetData(bitmapContext);
    fread(targetData,1,length,f);

    fclose(f);

    CGImageRef decompressedImageRef = CGBitmapContextCreateImage(bitmapContext);

    UIImage * result = [UIImage imageWithCGImage:decompressedImageRef scale:info.scale orientation:UIImageOrientationUp];

    CGContextRelease(bitmapContext);
    CGImageRelease(decompressedImageRef);
    CGColorSpaceRelease(cs);

    return result;
}
于 2012-09-23T21:11:22.313 に答える