1

私は大量の大きな画像のカルーセルに取り組んでおり、画像をロードするパフォーマンスを向上させるためにいくつかのテストを行っています。現在、別のキューで既に jpg を解凍している場合でも、iOS に含まれているフォト アルバム アプリと比較すると、まだ少し時間がかかります。さらに、画像を非常に高速に渡すと、memoryWarnings を生成できます。

だから私がやろうとしているのは、CGImageRef(または既に解凍されたUIImage:生データ)をコアデータに保存することです。しかし、私が見つけたすべての回答とオプションは UIImageJPegRepresentation を使用していますが、それを行うと、画像が再び圧縮されますね。

方法があるかどうか知っている人はいますか?問題の焦点を間違っていますか?

4

2 に答える 2

0

はい、画像をNSDataに変換して保存できます。例:

Entity *testEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:__managedObjectContext];
NSString *photoPath = [[NSBundle mainBundle] pathForResource:@"photo" ofType:@"png"];
if ([[NSFileManager defaultManager] fileExistsAtPath:photoPath]) {
    NSData *data = [NSData dataWithContentsOfFile:photoPath];
    [testEntity setPhoto:data];
}

これにより、画像がBLOBデータとしてsqliteファイルに保存されます。

于 2013-01-24T15:59:09.027 に答える
0

理想的には、大きな画像のUIImageオブジェクトをメモリに大量に保持しないでください。メモリに警告が表示されます。画像がローカルファイルの場合は、背景スレッドを使用して大きな画像をカルーセルに最適なサイズに拡大縮小するという1つのことを実行できます。これらのつまみの爪を保存して、元の画像にマッピングします。カルーセル用のサムネイルをロードし、元の画像ファイルを使用して詳細な画像を表示します。サムネイルは最大のパフォーマンスを得るためにpngになります。JpegデコードはiOSのネイティブではなく、pngよりも多くのcpuをデコードする必要があります。サムネイルデータをコアデータに保持するために、.pngファイルは私の経験では素晴らしい仕事をします。次のコードを使用して画像をロードできます

 UIImage * image = [UIImage imageWithContentsOfFile:filePath];

画像のサイズを変更するコードは次のとおりです

- (UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize {
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
CGImageRef imageRef = image.CGImage;

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

// Set the quality level to use when rescaling
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height);

CGContextConcatCTM(context, flipVertical);
// Draw into the context; this scales the image
CGContextDrawImage(context, newRect, imageRef);

// Get the resized image from the context and a UIImage
CGImageRef newImageRef = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

CGImageRelease(newImageRef);
UIGraphicsEndImageContext();

return newImage;

}

于 2013-01-24T15:59:42.910 に答える