我想为我在iPhone应用程序中显示的UIImage实现“自动级别”选项。在我自己尝试实现它之前,我想知道我应该使用的API中是否有任何图像处理方法,例如直方图等。还是应该只获取底层的CGImage并对其进行处理?(我是iPhone开发人员的新手。)
谢谢
MV
一种非常简单的方法是使用CGImageRef的解码数组,但这只能用于范围映射(无伽玛等)。
const CGFloat decode[6] = {blackPoint,whitePoint,blackPoint,whitePoint,blackPoint,whitePoint}; decodedImage = CGImageCreate(CGImageGetWidth(origImage), CGImageGetHeight(origImage), CGImageGetBitsPerComponent(origImage), CGImageGetBitsPerPixel(origImage), CGImageGetBytesPerRow(origImage), CGImageGetColorSpace(origImage), CGImageGetBitmapInfo(origImage), CGImageGetDataProvider(origImage), decode, YES, CGImageGetRenderingIntent(origImage) );
其中whitePoint是介于0.0和1.0之间的浮点数,它确定将哪个亮度映射到输出中的纯白色,而blackPoint也是一个浮点,它确定将哪个亮度映射到纯黑色。
解码数组的元素对应于色彩空间的组件,因此此代码仅适用于RBG图像。您可以将组件设置为不同的白色和黑色值,以创建简单的色彩校正。
您可以使用以下功能(不进行色彩校正)来计算whitePoint和blackPoint:
void CalculateAutocorretionValues(CGImageRef image, CGFloat *whitePoint, CGFloat *blackPoint) { UInt8* imageData = malloc(100 * 100 * 4); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(imageData, 100, 100, 8, 4 * 100, colorSpace, kCGImageAlphaNoneSkipLast); CGColorSpaceRelease(colorSpace); CGContextDrawImage(ctx, CGRectMake(0, 0, 100, 100), image); int histogramm[256]; bzero(histogramm, 256 * sizeof(int)); for (int i = 0; i < 100 * 100 * 4; i += 4) { UInt8 value = (imageData[i] + imageData[i+1] + imageData[i+2]) / 3; histogramm[value]++; } CGContextRelease(ctx); free(imageData); int black = 0; int counter = 0; // count up to 200 (2%) values from the black side of the histogramm to find the black point while ((counter < 200) && (black < 256)) { counter += histogramm[black]; black ++; } int white = 255; counter = 0; // count up to 200 (2%) values from the white side of the histogramm to find the white point while ((counter < 200) && (white > 0)) { counter += histogramm[white]; white --; } *blackPoint = 0.0 - (black / 256.0); *whitePoint = 1.0 + ((255-white) / 256.0); }