0

コア グラフィックス イメージ フィルターを削除する効率的な方法を考えようとしています。これは、UIImage にセピア効果を適用するフィルターのコードです。

-(UIImage*)applyFilter {

    CGImageRef inImage = self.CGImage;
    CFDataRef m_dataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
    UInt8* m_pixelBuf = (UInt8*)CFDataGetBytePtr(m_dataRef);

    int length = CFDataGetLength(m_dataRef);

    for (int i=0; i<length; i+=4) {
        filterSepia(m_pixelBuf, i);
    }

    CGContextRef ctx = CGBitmapContextCreate(m_pixelBuf,
                                         CGImageGetWidth(inImage),
                                         CGImageGetHeight(inImage),
                                         CGImageGetBitsPerComponent(inImage),
                                         CGImageGetBytesPerRow(inImage),
                                         CGImageGetColorSpace(inImage),
                                         CGImageGetBitmapInfo(inImage));

    CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    UIImage* finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CFRelease(m_dataRef);
    return finalImage;
}

void filterSepia(UInt8 *pixelBuf, UInt32 offset) {

    int r = offset;
int g = offset+1;
int b = offset+2;

int red = pixelBuf[r];
int green = pixelBuf[g];
int blue = pixelBuf[b];

    pixelBuf[r] = SAFECOLOR((red*0.393)+(green*0.769)+(blue*0.189));
    pixelBuf[g] = SAFECOLOR((red*0.349)+(green*0.686)+(blue*0.168));
    pixelBuf[b] = SAFECOLOR((red*0.272)+(green*0.534)+(blue*131));
}

この効果などを効率的に削除したいのですが、トグルボタンが押されたときにこのようなことを行うことができます

ヘッダー内:

#define SAFECOLOR(color) MIN(255, MAX(0,color))
BOOL toggleOn;
@property (nonatomic, retain)UIImage* image;

実装では:

-(IBAction)sepiaButton:(id)sender {

    UIImage* original = image;
    if (toggleOn) {
        [image applyFilter];
    } else {
        image = original;
    }
    toggleOn =! toggleOn
}

しかし、複数の画像フィルターが適用されると、これは非効率になる可能性がありますか、それともこれを行うためのより良い方法はありますか?

4

1 に答える 1

1

同じ画像を生成し続け、代わりにそれらを事前にレンダリングしないのはなぜですか? 元のバージョンのコピーを保持し、オーバーレイ ビューを非表示にします。

于 2012-11-10T21:03:40.680 に答える