Как обработать CIFilter, используя процессор вместо графического процессора? - PullRequest
3 голосов
/ 10 октября 2010

Кто-нибудь знает, как указать образ ядра для обработки CIImage через CIFilter с использованием процессора вместо графического процессора? Мне нужно обработать несколько очень больших изображений, и я получаю странные результаты с помощью графического процессора. Мне все равно, сколько времени потребуется, чтобы процессор был в порядке.

Ответы [ 3 ]

3 голосов
/ 01 ноября 2010

kCIContextUseSoftwareRenderer является ключевым здесь:

+ (CIContext*)coreContextFor:(NSGraphicsContext *)context forceSoftware:(BOOL)forceSoftware
{
    //CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                    (id)colorSpace, kCIContextWorkingColorSpace,
                                    (id)colorSpace, kCIContextOutputColorSpace,
                                    [NSNumber numberWithBool:forceSoftware], kCIContextUseSoftwareRenderer,
                                    nil];
    CIContext* result = [CIContext contextWithCGContext:(CGContext *)[context graphicsPort] options:contextOptions];
    CGColorSpaceRelease(colorSpace);
    return result;
}

Рендеринг в программном обеспечении more (CPU) решает некоторые проблемы, но ... На современных машинах настолько сильно снижается производительность, что я не могу 'не сказать, что это решение.Я использую CoreImage в своих приложениях и всегда выполняю рендеринг с графическим процессором на экране, в то время как принудительный процессор используется только для сохранения.Я заметил, что рендеринг процессора немного более точен на моем тестовом оборудовании, и сохранение отфильтрованного изображения - это долгий процесс, я могу пожертвовать скоростью здесь.

0 голосов
/ 28 марта 2016

Вот версия Swift:

func coreContextFor(context : CGContext,forceSoftware force : Bool) -> CIContext {
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let options : [String:AnyObject] = [
        kCIContextWorkingColorSpace: colorSpace!,
        kCIContextOutputColorSpace : colorSpace!,
        kCIContextUseSoftwareRenderer : NSNumber(bool: force)
    ]

    return CIContext(CGContext: context, options: options)
}
0 голосов
/ 11 октября 2010

Не ответ, но вы всегда можете переписать CIkernel как функцию, которая работает с пиксельным значением RGB, и после этого применить эту функцию в цикле к unsigned char [] данным изображения и преобразовать результат в CIImage.

...