画像の平均R、G、B値を計算するためにこのメソッドを書いています。次のメソッドは、UIImageを入力として受け取り、入力画像のR、G、B値を含む配列を返します。ただし、質問が1つあります。CGImageRefを適切にリリースするにはどうすればよいですか。
-(NSArray *)getAverageRGBValuesFromImage:(UIImage *)image
{
CGImageRef rawImageRef = [image CGImage];
//This function returns the raw pixel values
const UInt8 *rawPixelData = CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef)));
NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
NSUInteger imageWidth = CGImageGetWidth(rawImageRef);
//Here I sort the R,G,B, values and get the average over the whole image
int i = 0;
unsigned int red = 0;
unsigned int green = 0;
unsigned int blue = 0;
for (int column = 0; column< imageWidth; column++)
{
int r_temp = 0;
int g_temp = 0;
int b_temp = 0;
for (int row = 0; row < imageHeight; row++) {
i = (row * imageWidth + column)*4;
r_temp += (unsigned int)rawPixelData[i];
g_temp += (unsigned int)rawPixelData[i+1];
b_temp += (unsigned int)rawPixelData[i+2];
}
red += r_temp;
green += g_temp;
blue += b_temp;
}
NSNumber *averageRed = [NSNumber numberWithFloat:(1.0*red)/(imageHeight*imageWidth)];
NSNumber *averageGreen = [NSNumber numberWithFloat:(1.0*green)/(imageHeight*imageWidth)];
NSNumber *averageBlue = [NSNumber numberWithFloat:(1.0*blue)/(imageHeight*imageWidth)];
//Then I store the result in an array
NSArray *result = [NSArray arrayWithObjects:averageRed,averageGreen,averageBlue, nil];
return result;
}
2つのことを試しました。オプション1:そのままにしておきますが、数サイクル(5+)後にプログラムがクラッシュし、「メモリ不足の警告エラー」が発生します。
オプション2:メソッドが戻る前に1行のCGImageRelease(rawImageRef)を追加します。2番目のサイクルの後にクラッシュするようになりました。メソッドに渡すUIImageに対してEXC_BAD_ACCESSエラーが発生します。Xcodeで(RUNではなく)分析しようとすると、この行に次の警告が表示されます。「この時点で呼び出し元が所有していないオブジェクトの参照カウントの誤ったデクリメント」
CGImageRefをどこでどのようにリリースする必要がありますか?
ありがとう!