2014-10-20 2 views
0

색조 효과 필터를 적용하고 CGBitmapContext를 만드는 방법이 있습니다. 사용자가 필터의 버튼을 누를 때마다 메모리가 증가하고 메모리는 ARC에 의해 해제되지 않습니다. 매회 600KB를 추가합니다. 나는 약간의 조사를했고 에 발견했다. 코어 그래픽이 에 600KB를 더한다. CGDataProviderWithCopyOfData. 이 CGRaster 데이터을 어떻게 내놓을 수 있습니까?필터를 적용 할 때 CGDataProviderWithCopyOfData를 해제하십시오.

또한
imageRef = CGBitmapContextCreateImage(ctx); 
UIImage *result = [UIImage imageWithCGImage:imageRef]; 
CFRelease (imageRef); 
CGContextRelease(ctx); 
CGColorSpaceRelease(colorSpace); 
CFRelease(ctx); 

는 깔끔한 모양 (더 읽을 수) 수에 :이 같은 imageRefCFRelease를 호출 할 필요가

-(UIImage *)modifyImageTintColor:(UIImage *)source imageRawData:(Byte *)rawData degree:(int)degree{ 

double PI = 3.14159; 
double HALF_CIRCLE_DEGREE = 180; 
double RANGE = 256; 

int RY, GY, BY, RYY, GYY, BYY, R, G, B, Y; 
double angle = (PI * (double)degree)/HALF_CIRCLE_DEGREE; 

int S = (int)(RANGE * sin(angle)); 
int C = (int)(RANGE * cos(angle)); 

CGFloat r, g, b; 
//apply sepia effect 

int byteIndex = 0; 
for(int i = 0; i < _imageWidth * _imageHeight; ++i){ 

    r = rawData[byteIndex]; 
    g = rawData[byteIndex + 1]; 
    b = rawData[byteIndex + 2]; 

    RY = (70 * r - 59 * g - 11 * b)/100; 
    GY = (-30 * r + 41 * g - 11 * b)/100; 
    BY = (-30 * r - 59 * g + 89 * b)/100; 
    Y = (30 * r + 59 * g + 11 * b)/100; 
    RYY = (S * BY + C * RY)/256; 
    BYY = (C * BY - S * RY)/256; 
    GYY = (-51 * RYY - 19 * BYY)/100; 
    R = Y + RYY; 
    R = (R < 0) ? 0 : ((R > 255) ? 255 : R); 
    G = Y + GYY; 
    G = (G < 0) ? 0 : ((G > 255) ? 255 : G); 
    B = Y + BYY; 
    B = (B < 0) ? 0 : ((B > 255) ? 255 : B); 

    rawData[byteIndex] = R; 
    rawData[byteIndex + 1] = G; 
    rawData[byteIndex + 2] = B; 

    byteIndex += 4; 


} 

NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * _imageWidth; 
NSUInteger bitsPerComponent = 8; 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGImageRef imageRef; 

CGContextRef ctx; 
ctx = CGBitmapContextCreate(rawData, 
          _imageWidth, 
          _imageHeight, 
          bitsPerComponent, 
          bytesPerRow, 
          colorSpace, 
          kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

imageRef = CGBitmapContextCreateImage(ctx); 
UIImage *result = [UIImage imageWithCGImage:imageRef]; 
CGContextRelease(ctx); 
CGColorSpaceRelease(colorSpace); 
CFRelease(ctx); 

return result; 

}

+0

대답이있는 사람이 있습니까 ??? –

답변

0

: 여기

는 방법 다음과 같이 맞춤 이탈 장치 대신 항상 CFRelease를 사용하십시오.

imageRef = CGBitmapContextCreateImage(ctx); 
UIImage *result = [UIImage imageWithCGImage:imageRef]; 
CFRelease (imageRef); 
CGRelease(ctx); 
CGRelease(colorSpace); 
CFRelease(ctx); 
+0

CGImageRef에서 CFRelease를 호출 할 수 없습니다. –

+0

'imageRef'에서 CFRelease를 호출 할 수 있습니다. 다음은 CGImageRef의'CGImageRelesae'에 대한 Apple [Documentation] (https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CGImage/index.html#//apple_ref/c/func/CGImageRelease)입니다. 토론 섹션을 살펴보십시오. –

+0

그게 내 문제를 해결하지 못했습니다. –

관련 문제