0

iOS およびほとんどのモバイル デバイスでは、メモリの制約により、ロードできる画像のサイズに制限があります。ディスク上に大きな画像 (たとえば 5,000 ピクセル x 5,000 ピクセル) を保持し、その画像内の小さな四角形 (たとえば 100x100) のみをメモリに読み取って表示することは可能ですか?

言い換えれば、画像の小さな部分だけを見たい場合、画像全体をメモリにロードする必要があるのでしょうか? 小さい部分だけをロードできる場合、どうすればこれを行うことができますか?

このようにして、スプライトシートが繰り返しコンテンツに対して行うように、多くのスペースを節約できます。全体的な目標はファイル サイズを最小限に抑えることなので、大きな画像は jpeg や png などの圧縮形式で圧縮する必要があることに注意してください。ビデオ全体をメモリにロードすることは決してないため、ビデオ形式はこのようなものだと思います。

4

3 に答える 3

2

私はこのテクニックを利用していませんが、次のAppleサンプルが役立つかもしれません。

LargeImageDownsizingサンプル

于 2012-05-15T16:38:52.390 に答える
1

あなたはこのようにマップされたもので何かをすることができますNSData

UIImage *pixelDataForRect(NSString *fileName, const CGRect pixelRect)
{
    // get the pixels from that image
    uint32_t width = pixelRect.size.width;
    uint32_t height = pixelRect.size.height;

    // create the context
    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    CGContextRef bitMapContext = UIGraphicsGetCurrentContext();

    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, height);
    CGContextConcatCTM(bitMapContext, flipVertical);

    // render the image (assume PNG compression)
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef) [NSData dataWithContentsOfMappedFile:fileName]);
    CGImageRef image = CGImageCreateWithPNGDataProvider(provider, NULL, YES, kCGRenderingIntentDefault);
    CGDataProviderRelease(provider);

    uint32_t imageWidth = CGImageGetWidth(image);
    uint32_t imageHeight = CGImageGetHeight(image);

    CGRect drawRect = CGRectMake(-pixelRect.origin.x, -((imageHeight - pixelRect.origin.y) - height), imageWidth, imageHeight);
    CGContextDrawImage(bitMapContext, drawRect, image);

    CGImageRelease(image);

    UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return retImage;
}
于 2012-05-15T17:33:06.480 に答える
0

あなたの最善の策は、CATiledLayer で UIScrollView を使用することです。

これを行う方法の説明については、WWDC 2010 の「Designing Apps with Scroll Views」プレゼンテーションを参照してください。

https://developer.apple.com/videos/wwdc/2010/

アイデアは、大きな画像を取得してタイルに切り刻み、UIScrollView を使用してユーザーに画像のスクロール可能なビューを提供し、スクロールビューの位置に基づいて必要な画像のセクションのみをロードすることです。これは、CATiledLayer を使用して実現されます。

于 2012-05-18T00:15:03.567 に答える