1

假设如下:

  • 您在 ipad 应用程序中从 Internet 下载图像
  • 您可以以任何您想要的方式对图像进行后处理,所花费的时间并不重要(下载数据时需要进行 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 回答