2

これが要点です。多くの小さな画像で構成された大きな画像を持つプログラムがあり、この画像を取得して、ユーザーが移動してスクラブできる多くの小さな画像(映画のフレームなど)に分割します。

私は現在この方法を使用しています

- (NSMutableArray *)createArrayFromImage: (NSData *)largerImageData
{
    UIImage *largerImage = [UIImage imageWithData: largerImageData];
    int arraySize = (int)largerImage.size.height/largerImage.size.width; //Find out how many images there are
    NSMutableArray *imageArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < arraySize; i++) {

        CGRect cropRect = CGRectMake(0, largerImage.size.width * i, largerImage.size.width, largerImage.size.width);
        CGImageRef imageRef = CGImageCreateWithImageInRect([largerImage CGImage], cropRect);
        UIImage *image = [UIImage imageWithCGImage: imageRef];
        CGImageRelease(imageRef);

        [imageArray addObject: UIImageJPEGRepresentation(image, 1.0)];
        NSLog(@"Added image %d", i);
    }

    NSLog(@"Final size %d", (int)[imageArray count]);
    return imageArray;
}

ただし、これは呼び出されるため非常に遅く、配列に直接UIImageJPEGRepresentation追加するだけではるかに高速になりUIImageますが、ユーザーが配列から画像をスクラブするときにこれを行うと、大量のメモリの割り当てが開始され、最終的にアプリが強制的にクラッシュします. [UIImageView setImage:];それが役立つ場合は呼び出します。これに関するご支援をいただければ幸いです。

ED|T: CGImageCreateWithImageInRect が "largerImage" を保持する可能性があるため、大量のメモリが消費される

4

2 に答える 2

1

基本的に、あなたの目標は、画像の特定の部分をユーザーにランダムに表示するようです。

画像の小さい部分だけを表示したい場合は、小さい画像を作成する必要はありません。特に大きな画像を一度にメモリにロードできる場合。代わりに、ビューのクリッピングを試して、画像の表示部分を調整してください。

たとえば、これを試すことができます。

  1. 大きな画像を と に設定UIImageViewsizeToFitます。
  2. image-view を の中に入れますUIView
  3. のフレームをUIView小さな画像サイズに設定します。
  4. clipsToBoundsのアウターUIViewYES
  5. transformインナーのアジャストでUIImageView見える部分をコントロール。

UIScrollViewこれは、ユーザーの操作による自動スクロールを除いて、本質的に同じです。

コード例を次に示します。

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImageView*    v1  =   [[UIImageView alloc] init];
    [v1 setImage:[UIImage imageWithContentsOfFile:@"large-image.png"]];
    [v1 sizeToFit];

    UIView* v2  =   [[UIView alloc] init];
    [v2 setFrame:CGRectMake(0, 0, 100, 100)];
    [v2 addSubview:v1];
    [v2 setClipsToBounds:YES];

    // Set transform later to adjust visible portion.
    v1.transform    =   CGAffineTransformMakeTranslation(-100, -100);

    [self.view addSubview:v2];
}
于 2014-07-14T11:32:53.480 に答える
0

メモリ内で小さな画像を使用する代わりに、サイズが小さい場合はこの画像を DB に保存してみてください。しかし、大きな画像を小さな画像にトリミングする必要がある理由がわかりません。CATiledLayer を使用して画像の小さな部分をズームしてプレビューすることができ、その部分の CGRect のみが必要です。

于 2014-07-14T11:44:21.240 に答える