1

私は何千もの小さな画像を持っています。それらを同時に1ダースずつ大きな画像に組み合わせて画面に表示する必要があります。ユーザーは、小さな画像をどのようにロード/結合するかに関係なく、1つずつ表示される小さな画像をすばやくスムーズに見ることができる必要があります。

つまり:

BigImage + = SmallImage1;

BigImage + = SmallImage2;

BigImage + = SmallImage3;

..。

BigImage + = SmallImage1000 +;

最初は、addSubviews/addSublayersを使用して小さな画像を大きな画像に追加しただけです。ご想像のとおり、ビューが多すぎてレンダリングできないため、大きな遅延が発生しました。

そこで、imageView(大きな画像)を1つだけ使用して、毎回小さな画像を大きな画像に結合しようとしました。だから私は次のようなコードを書きました:

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0f);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[bgImageView.layer renderInContext:ctx];
//[bgImageView.image drawInRect:self.frame];  // This line or the line above, same result
[smallImg drawInRect:rectToWindow];
bgImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

しかし、それでも大きなラグの問題があります(ただし、方法は異なります)。それは、毎回大きな画像をレンダリングするため、コストがかかるためだと思います。

したがって、問題は次のとおりです。

大きな画像をコンテキスト内でレンダリングし続けることができ、毎回レンダリングしない可能性はありますか?

または、私が必要なことを実行できるより良いアイデアがあるかもしれません。私に話しかけてください、どんなアイデアも役に立ちます。

君たちありがとう。

4

3 に答える 3

0

大量の画像を処理している場合は、OpenGLESが最適なオプションであり、単一のEAGLビューを使用します。

于 2013-02-15T18:26:06.277 に答える
0

ビューはのサブクラスである必要があると思います。UIImageView小さな画像のグループを大きな画像に追加する場合は、次の方法を使用します。

- (UIImage *)addSmallImages:(NSArray *)smallImages   // array of UIImage
                   atPoints:(NSArray *)points        // array of NSValue
                 toBigImage:(UIImage *)bigImage
{
    if (smallImages.count != points.count)
    {
        NSLog(@"Array size mismatch");
        return nil;
    }

    NSUInteger count = [smallImages count];

    UIGraphicsBeginImageContextWithOptions(bigImage.size, NO, 0.0); 
    [bigImage drawAtPoint:CGPointZero];

    for (NSUInteger i = 0; i < count; i++)
    {
        UIImage *smallImage = [smallImages objectAtIndex:i];
        NSValue *pointVal = [points objectAtIndex:i];
        CGPoint point = [pointVal CGPointValue];
        [smallImage drawAtPoint:point];
    }

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();
    return newImage; 
}

これは次のようなものと呼ばれます。

NSMutableArray *smallImages = [[NSMutableArray alloc] init];
NSMutableArray *points = [[NSMutableArray alloc] init];

for (NSUInteger i = 0 ...)
{
    [smallImages addObject:smallImage];
    [points addObject:[NSValue valueWithCGPoint:CGMakePoint(100.0, 120.0)]];
}

imageView.view = [self addSmallImages:smallImages atPoints:points toBigImage:imageView.view];

「小さな画像」を「大きな画像」にアニメーション化する場合は、を作成しCALayer、それに「小さな画像」を適用してから、適切な場所にアニメーション化することでそれを行うことができます。次に、上記のメソッドを呼び出して変更をコミットしてから、レイヤーを削除します。

于 2013-02-15T18:45:15.180 に答える
0

私の最初のアイデアは、UIViewを描画し、drawRect:各画像を1/10秒ごとなどに描画することです。その後、のような関数を使用してUIGraphicsGetImageFromCurrentImageContext()、コンテキスト全体を画像に保存します。このようにして、画像は動的に描画されます(したがって、長い時間がかかる場合でも、ユーザーはそれが発生することを確認できます)。

私の2番目のアイデアはCGBitmapContext、バックグラウンドスレッドに描画し、描画中にアクティビティインジケーターを追加することです。

于 2013-02-15T18:46:01.537 に答える