6

2 つの UIImage を 1 つのコンテキストにマージしています。動作しますが、パフォーマンスがかなり遅く、より高速なソリューションが必要です。mergeImage: withImage:私の解決策は、iPad 1Gで電話をかけるのに約400ミリ秒かかることです。

これが私がすることです:

-(CGContextRef)mergeImage:(UIImage*)img1 withImage:(UIImage*)img2
{
    CGSize size = [ImageToolbox getScreenSize];
    CGContextRef context = [ImageToolbox createARGBBitmapContextFromImageSize:CGSizeMake(size.width, size.height)];

    CGContextSetRenderingIntent(context, kCGRenderingIntentSaturation);

    CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), img1.CGImage);
    CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), img2.CGImage);


    return context;
}

ImageToolbox クラスの静的メソッドは次のとおりです。

static CGRect screenRect;

+ (CGContextRef)createARGBBitmapContextFromImageSize:(CGSize)imageSize
{
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;

    size_t pixelsWide = imageSize.width;
    size_t pixelsHigh = imageSize.height;

    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

    colorSpace = CGColorSpaceCreateDeviceRGB();
    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        return NULL;
    }

    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL)
    {
        fprintf (stderr, "Memory not allocated!");
        CGColorSpaceRelease( colorSpace );
        return NULL;
    }

    context = CGBitmapContextCreate (bitmapData,
                                     pixelsWide,
                                     pixelsHigh,
                                     8,      // bits per component
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
    }

    CGColorSpaceRelease( colorSpace );

    return context;
}

+(CGSize)getScreenSize
{
    if (screenRect.size.width == 0 && screenRect.size.height == 0)
    {
        screenRect = [[UIScreen mainScreen] bounds];    

    }
    return CGSizeMake(screenRect.size.height, screenRect.size.width-20);
}

パフォーマンスを向上させるための提案はありますか?

4

2 に答える 2

0

インストルメントを使用して、最も時間がかかっているメッセージのプロファイルを作成することを強くお勧めします。そうすれば、実際にメッセージを分類できます。また、私は、はるかに少ないコードで同じことを行う必要があると思ういくつかのメソッドを作成しましたが、実際にカスタマイズ可能に保つには、すべてを自分のやり方で書き出す必要があります。ここにとにかくあります:

-(CGContextRef)mergeImage:(UIImage *)img1 withImage:(UIImage *)img2
{  
  CGSize size = [ImageToolbox getScreenSize];
  CGRect rect = CGRectMake(0, 0, size.width, size.height);

  UIGraphicsBeginImageContextWithOptions(size, YES, 1.0);

  CGContextRef context = UIGraphicsGetCurrentContext();

  CGContextSetRenderingIntent(context, kCGRenderingIntentSaturation);

  [img1 drawInRect:rect];
  [img2 drawInRect:rect];

  UIGraphicsEndImageContext();

  return context;
}

または、結合された画像がすぐに必要な場合:

- (UIImage *)mergeImage:(UIImage *)img1 withImage:(UIImage *)img2
{
  CGSize size = [ImageToolbox getScreenSize];
  CGRect rect = CGRectMake(0, 0, size.width, size.height);

  UIGraphicsBeginImageContextWithOptions(size, YES, 1.0);

  CGContextRef context = UIGraphicsGetCurrentContext();

  CGContextSetRenderingIntent(context, kCGRenderingIntentSaturation);

  [img1 drawInRect:rect];
  [img2 drawInRect:rect];

  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  return image;
}

それらがより速くなるかどうかはわかりませんが、楽器のプロファイルが壊れていない限り、あなたが持っているものを非常に簡単にスピードアップする方法は本当にわかりません。

いずれにせよ、これがお役に立てば幸いです。

于 2012-05-29T22:10:22.773 に答える
0

画像をマージするより高速な方法を見つけることができませんでした。操作を高速化するために画像サイズを縮小しました。

于 2012-06-13T08:12:30.337 に答える