Автоматическое улучшение изображений

Мне нужно использовать автоматическое улучшение изображений Apple в моем коде. Я нашел пример, который показал Apple, но я не могу заставить его работать. Я на самом деле не уверен, что я делаю неправильно.

Вот что рекомендует Apple: AutoEnhanceCode

Вот что я делаю (imageFinal — это UIImage, который я хочу улучшить):

- (IBAction)enhance:(id)sender {
  CIImage *myImage;
  CIImage *image = [imageFinal CIImage];
  NSDictionary *options = [NSDictionary dictionaryWithObject:[[image properties]valueForKey:kCIImageProperties] forKey:CIDetectorImageOrientation];
  NSArray *adjustments = [myImage autoAdjustmentFiltersWithOptions:options];
  for (CIFilter *filter in adjustments){
    [filter setValue:myImage forKey:kCIInputImageKey];
    myImage = filter.outputImage;
}

}

Ошибка, которую я получаю: несовместимые типы указателей, отправляющие «const CFStringRef» (он же «const struct __CFString * const») в параметр типа «NSString *»

Я действительно не знаю, как использовать этот kCGImagePropertyOrrientation. Я просто хочу применить это простое улучшение.

Ваше здоровье.


person jovanjovanovic    schedule 14.08.2013    source источник
comment
Пожалуйста, замените изображение вашего кода фактическим текстом кода. Читать и копировать будет намного легче.   -  person rmaddy    schedule 14.08.2013
comment
Я хотел поставить реальный скриншот, чтобы кто-то мог видеть, что подчеркнуто. Ваше здоровье   -  person jovanjovanovic    schedule 14.08.2013


Ответы (2)


CFString является бесплатным мостом для NSString. Так что вы можете просто привести его (NSString *), и он будет работать. Тем не менее, я также столкнулся с этим небольшим фрагментом неполного примера кода и подумал, что могу его немного улучшить... Создал категорию target-c для решения проблемы. Во-первых, убедитесь, что вы включили фреймворки Core Image и ImageIO в свой код.

Заголовок:

@interface UIImage (AutoEnhance)
- (UIImage *)autoEnhancedImage;
@end

Реализация:

#import <CoreImage/CoreImage.h>
#import <ImageIO/ImageIO.h>

@implementation UIImage (AutoEnhanced)
- (UIImage *)autoEnhancedImage
{
    CIImage *ciOriginal = self.CIImage;
    if(!ciOriginal) {
        ciOriginal = [[CIImage alloc] initWithCGImage:self.CGImage];
    }
    NSDictionary *options = @{ CIDetectorImageOrientation : @(self.CGImagePropertyOrientation)};
    NSArray *adjustments = [ciOriginal autoAdjustmentFiltersWithOptions:options];
    for (CIFilter *filter in adjustments) {
        [filter setValue:ciOriginal forKey:kCIInputImageKey];
        ciOriginal = filter.outputImage;
    }
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImage = [context createCGImage:ciOriginal fromRect:ciOriginal.extent];
    UIImage *enhancedImage = [[UIImage alloc] initWithCGImage:cgImage];
    CGImageRelease(cgImage);
    return enhancedImage;
}

- (CGImagePropertyOrientation)CGImagePropertyOrientation
{
    switch (self.imageOrientation) {
        case UIImageOrientationUp:
            return kCGImagePropertyOrientationUp;
        case UIImageOrientationUpMirrored:
            return kCGImagePropertyOrientationUpMirrored;
        case UIImageOrientationDown:
            return kCGImagePropertyOrientationDown;
        case UIImageOrientationDownMirrored:
            return kCGImagePropertyOrientationDownMirrored;
        case UIImageOrientationLeftMirrored:
            return kCGImagePropertyOrientationLeftMirrored;
        case UIImageOrientationRight:
            return kCGImagePropertyOrientationRight;
        case UIImageOrientationRightMirrored:
            return kCGImagePropertyOrientationRightMirrored;
        case UIImageOrientationLeft:
            return kCGImagePropertyOrientationLeft;
    }
}
@end

Затем, чтобы использовать его, просто:

UIImage *enhancedImage = [someUIImage autoEnhancedImage];
person BadPirate    schedule 24.03.2015
comment
Он работает, но по какой-то причине он никогда не освобождает память. После использования этого кода моя память подскакивает примерно на 50-60 мб. И даже отпускание не имеет никакого эффекта. - person Hassy; 28.05.2018
comment
@Hassy - Если у вас открыт код, проверьте его на наличие утечек. Я предполагаю, что один из объектов c выделен, но не освобожден. - person BadPirate; 29.05.2018
comment
То же самое, огромные утечки, даже с авторелизпулом - person Xys; 18.01.2019
comment
@Xys - То же самое, о чем я просил поспешно, настроить его на наличие утечек и отредактировать код, когда вы думаете, что нашли исправление. Здесь создаются только cgImage (create), который запускается вручную, ciOriginal иEnhancedImage (alloc), которые запускаются автоматически в ARC :/ - person BadPirate; 24.01.2019

Вот версия Swift для автоматического улучшения UIImage

extension UIImage {
    func autoEnhance() -> UIImage? {
        if var ciImage = CIImage.init(image: self) {
            let adjustments = ciImage.autoAdjustmentFilters()
            for filter in adjustments {
                filter.setValue(ciImage, forKey: kCIInputImageKey)
                if let outputImage = filter.outputImage {
                    ciImage = outputImage
                }
            }
            let context = CIContext.init(options: nil)
            if let cgImage = context.createCGImage(ciImage, from: ciImage.extent) {
                let finalImage = UIImage.init(cgImage: cgImage, scale: self.scale, orientation: self.imageOrientation)
                return finalImage
            }
        }
        return nil
    }
}

Использование:

let autoEnhanced = image.autoEnhance() // returns optional UIImage
person Shachar    schedule 17.12.2018