3

カメラから撮影した画像を他のプリセット画像と重ね合わせようとしています。問題は、カメラからの画像が 8MP である可能性があり、これはメモリ使用量が非常に大きいことです。一部のオーバーレイは、画像全体をカバーしようとする場合があります。

それらをすべて1つの画像にマージする複数の方法を試しました。

UIGraphicsBeginImageContextWithOptions(_imageView.image.size, NO, 1.0f);
[_containerView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

また

CGContextDrawImage(UIGraphicsGetCurrentContext(), (CGRect){CGPointZero, _imageView.image.size}, _imageView.image.CGImage);
CGContextDrawImage(UIGraphicsGetCurrentContext(), (CGRect){CGPointZero, _imageView.image.size}, *other image views*);

また

UIImage* image = _imageView.image;
CGImageRef imageRef = image.CGImage;

size_t imageWidth = (size_t)image.size.width;
size_t imageHeight = (size_t)image.size.height;

CGContextRef context = CGBitmapContextCreate(NULL, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef), CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef));

CGRect rect = (CGRect){CGPointZero, {imageWidth, imageHeight}};
CGContextDrawImage(context, rect, imageRef);
CGContextDrawImage(context, rect, **other images**);
CGImageRef newImageRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);

UIImage* resultImage = nil;

NSURL* url  = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"x.jpg"]];
CFURLRef URLRef = CFBridgingRetain(url);
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(URLRef, kUTTypeJPEG, 1, NULL);
if (destination != NULL)
{
    CGImageDestinationAddImage(destination, newImageRef, NULL);
    if (CGImageDestinationFinalize(destination))
    {
        resultImage = [[UIImage alloc] initWithContentsOfFile:url.path];
    }
    CFRelease(destination);
}
CGImageRelease(newImageRef);

これらはすべて機能しますが、本質的に、現在のメモリ使用量が 2 倍になります。

新しいコンテキストを作成する必要なく、それらをすべて一緒に構成する方法はありますか? すべての画像をファイル システムに保存し、実際に大量のメモリを消費することなく、そこでマージを行うのでしょうか。あるいは、タイルごとにファイルシステム タイルにレンダリングすることもあるでしょうか?

これからどこへ行くべきか、何か提案や指針はありますか?

ありがとう

4

1 に答える 1

1

次のコードを確認してください。次のメソッドに複数の画像を送信できますが、メモリの問題に直面しているため、同じメソッドを繰り返し呼び出して複数の画像をマージすることをお勧めします。ただし、このプロセスにはさらに時間がかかる場合があります。

-(CGImageRef )mergedImageFromImageOne:(UIImage *)imageOne andImageTwo:(UIImage *)imageTwo
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    CGSize imageSize = imageOne.size;

    UIGraphicsBeginImageContext(sizeVideo);

    [imageOne drawInRect:CGRectMake(0,0,imageSize.width,imageSize.height)];

    [imageTwo drawInRect:CGRectMake(0,0,imageSize.width,imageSize.height) alpha:1];

    CGImageRef imageRefNew =  CGImageCreateWithImageInRect(UIGraphicsGetImageFromCurrentImageContext().CGImage, CGRectMake(0,0,imageOne.width,imageOne.height));

    UIGraphicsEndImageContext();

    [pool release];

    return imageRefNew;
}

お役に立てれば。

于 2013-03-21T06:07:50.660 に答える