6

以下の問題を解決するための解決策を探していましたが、見つかりませんでした。HSVの値を変更するフィルタリング メソッドを作成しましたUIImage。この方法は問題なく動作していますが、この方法を使用すると、使用済みメモリが大きくなり、解放できなくなります。CFDataInstrumentsの「Live Bytes」のボックスで、 (store)の値がフィルタリングごとに数MB増加することがわかりました。どうすれば解放できますか?? 同様の質問が見つかりましたが、この問題には問題ありません。ありがとうございました。

//Objective-C
- (UIImage*)addFilter:(UIImage*)img{
    CGImageRef imgRef = img.CGImage;

    //getting size
    size_t width = CGImageGetWidth(imgRef);
    size_t height = CGImageGetHeight(imgRef);
    size_t bitsPerComponent = CGImageGetBitsPerComponent(imgRef);
    size_t bitsPerPixel = CGImageGetBitsPerPixel(imgRef);
    size_t bytesPerRow = CGImageGetBytesPerRow(imgRef);


    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imgRef);
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imgRef);
    bool shouldInterpolate = CGImageGetShouldInterpolate(imgRef);
    CGColorRenderingIntent renderingIntent = CGImageGetRenderingIntent(imgRef);
    CGDataProviderRef dataProvider = CGImageGetDataProvider(imgRef);
    CFMutableDataRef *data = CGDataProviderCopyData(dataProvider);
    UInt8 *buf = (UInt8 *)CFDataGetMutableBytePtr(data);


    double h,s,v;
    double c;
    double cmax,cmin;
    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {

        /////////////////////
        ///change HSV value//
        /////////////////////

        }
    }

    CFDataRef  filterData = CFDataCreate(NULL, buf, CFDataGetLength(data));
    CGDataProviderRef filterDataProvider = CGDataProviderCreateWithCFData(filterData);
    CGImageRef filterCgImage = CGImageCreate(
                                             width,
                                             height,
                                             bitsPerComponent,
                                             bitsPerPixel,
                                             bytesPerRow,
                                             colorSpace,
                                             bitmapInfo,
                                             filterDataProvider,
                                             NULL,
                                             shouldInterpolate,
                                             renderingIntent
                                             );

    UIImage *imgFinal =  [UIImage imageWithCGImage:filterCgImage];

    CFRelease(filterData);
    CGImageRelease(filterCgImage);
    CGDataProviderRelease(filterDataProvider);
    CFRelease(data);

    return imgFinal;

}
4

0 に答える 0