好的,我认为我已经成功了!以下是我从 https://dev59.com/_Ijca4cB1Zd3GeqPtjzl#30447041 和几个连接部分中整理出来的:
@import Accelerator;
CIImage *ciImage = [CIImage imageWithCGImage:cgImage];
...
CIContext* context = [[CIContext alloc] init];
CGImageRef cgImage = [context createCGImage:ciImage fromRect:ciImage.extent];
...
CGImageRef CreateEqualisedCGImageFromCGImage(CGImageRef original)
{
vImage_Error err;
vImage_Buffer _img;
vImage_CGImageFormat format = {
.bitsPerComponent = 8,
.bitsPerPixel = 32,
.colorSpace = NULL,
.bitmapInfo = (CGBitmapInfo)kCGImageAlphaFirst,
.version = 0,
.decode = NULL,
.renderingIntent = kCGRenderingIntentDefault,
};
CGFloat width = CGImageGetWidth(original);
CGFloat height = CGImageGetHeight(original);
vImage_Buffer _dstA, _dstR, _dstG, _dstB;
err = vImageBuffer_InitWithCGImage(&_img, &format, NULL, original, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_InitWithCGImage error: %ld", err);
err = vImageBuffer_Init( &_dstA, height, width, 8 * sizeof( uint8_t ), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (alpha) error: %ld", err);
err = vImageBuffer_Init( &_dstR, height, width, 8 * sizeof( uint8_t ), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (red) error: %ld", err);
err = vImageBuffer_Init( &_dstG, height, width, 8 * sizeof( uint8_t ), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (green) error: %ld", err);
err = vImageBuffer_Init( &_dstB, height, width, 8 * sizeof( uint8_t ), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (blue) error: %ld", err);
err = vImageConvert_ARGB8888toPlanar8(&_img, &_dstA, &_dstR, &_dstG, &_dstB, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageConvert_ARGB8888toPlanar8 error: %ld", err);
err = vImageEqualization_Planar8(&_dstR, &_dstR, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (red) error: %ld", err);
err = vImageEqualization_Planar8(&_dstG, &_dstG, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (green) error: %ld", err);
err = vImageEqualization_Planar8(&_dstB, &_dstB, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (blue) error: %ld", err);
err = vImageConvert_Planar8toARGB8888(&_dstA, &_dstR, &_dstG, &_dstB, &_img, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageConvert_Planar8toARGB8888 error: %ld", err);
err = vImageContrastStretch_ARGB8888( &_img, &_img, kvImageNoError );
if (err != kvImageNoError)
NSLog(@"vImageContrastStretch_ARGB8888 error: %ld", err);
free(_dstA.data);
free(_dstR.data);
free(_dstG.data);
free(_dstB.data);
CGImageRef result = vImageCreateCGImageFromBuffer(&_img, &format, NULL, NULL, kvImageNoFlags, &err);
if (err != kvImageNoError)
NSLog(@"vImageCreateCGImageFromBuffer error: %ld", err);
free(_img.data);
return result;
}
这个解决方案的优点归功于
https://stackoverflow.com/users/4735340/james-bush,但是我为寻找一种以图像为导向的解决方案(与该问题中讨论的视频处理不同)而毫无成果而苦苦寻找,我认为这样一个现成的答复是相关的。 在OS X或iOS上查找“AutoLevels”并没有任何效果,我希望这对其他人有用。