색조 효과 필터를 적용하고 CGBitmapContext를 만드는 방법이 있습니다. 사용자가 필터의 버튼을 누를 때마다 메모리가 증가하고 메모리는 ARC에 의해 해제되지 않습니다. 매회 600KB를 추가합니다. 나는 약간의 조사를했고 에 발견했다. 코어 그래픽이 에 600KB를 더한다. CGDataProviderWithCopyOfData. 이 CGRaster 데이터을 어떻게 내놓을 수 있습니까?필터를 적용 할 때 CGDataProviderWithCopyOfData를 해제하십시오.
또한imageRef = CGBitmapContextCreateImage(ctx);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CFRelease (imageRef);
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
CFRelease(ctx);
는 깔끔한 모양 (더 읽을 수) 수에 :이 같은 imageRef
에 CFRelease
를 호출 할 필요가
-(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;
}
대답이있는 사람이 있습니까 ??? –