Будет ли Quartz CIFilter создавать другой выход, независимо от того, выполняется ли он на GPU или CPU? - PullRequest
3 голосов
/ 18 октября 2011

Я застрял с проблемой на CIFilters и их применения.Либо фильтр применяется только к 1/3 изображения (GPU), либо фильтр работает только один раз (CPU).Повторение той же операции на процессоре приведет к 1/3 изображения;повторяя операцию на том же самом с вычислениями CPU, CIFilter не работает / не применяется.

Я пытался добавить примеры изображений, но я здесь для начала, так что это не разрешено. Пожалуйста, посмотрите на мой оригинальный пост в Apple https://discussions.apple.com/message/16412850#16412850.Приносим извинения за неудобства.

Вопросы:

  • Почему CIFilter не работает детерминистически на процессоре?
  • Почему рендерер GPU останавливается точно послетреть изображения?
  • Есть ли способ отладки CIFilter?QuartzComposer разрешает только заданный код ядра - но есть ли отладчик / регистратор?

Заранее спасибо, Дирк

PS. Я также пытался переключить видеокарту,но это тоже не помогло.

Вот код, части взяты из примера ImageApp от Apple.

- (void)createCGImageAtPathNamed:(NSString*)destPath
{
    if (false == didInit)
        return ;

    CGColorSpaceRef myColorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);


    size_t height = CGImageGetHeight(leftCGImageRef);
    size_t width = CGImageGetWidth(leftCGImageRef);
    CGRect rect = {{0,0}, {width, height}};
    size_t bitsPerComponent = 8;
    size_t bytesPerRow = rect.size.width*4;         //bytes per row - one byte each for argb
    bytesPerRow += (16 - bytesPerRow%16)%16;    

    CGImageAlphaInfo alphaInfo = kCGImageAlphaPremultipliedFirst;

    CGContextRef context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, myColorspace, alphaInfo);

    NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithBool: wantsSoftRenderer],kCIContextUseSoftwareRenderer,nil];


    CIContext* cicontext = [CIContext contextWithCGContext: context options: contextOptions];
    CIImage *ciimgLeft = leftCIImage;
    CIImage *ciimgRight = rightCIImage;


    CIFilter *mFilter;

    [CIPlugIn loadAllPlugIns];
    mFilter = [[CIFilter filterWithName: @"CILightenBlendMode"] retain];
    [mFilter setValue: ciimgLeft forKey: @"inputImage"];
    [mFilter setValue: ciimgRight forKey: @"inputBackgroundImage"];

    CIImage* resultingImage = [mFilter valueForKey: kCIOutputImageKey];

    CGRect extent = [ciimgLeft extent];

    [cicontext drawImage: resultingImage inRect:rect fromRect:extent];

    CGImageRef image = CGBitmapContextCreateImage(context);

    CGContextRelease(context);

    NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage: image];
    NSData *jpegData = [bitmapRep representationUsingType:NSJPEGFileType properties:nil];

    [jpegData writeToFile: destPath atomically: YES];
    [bitmapRep release];
    [mFilter release];
    CGColorSpaceRelease(myColorspace);
}
...