以下の問題を解決するための解決策を探していましたが、見つかりませんでした。HSV
の値を変更するフィルタリング メソッドを作成しましたUIImage
。この方法は問題なく動作していますが、この方法を使用すると、使用済みメモリが大きくなり、解放できなくなります。CFData
Instrumentsの「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;
}