CIFilter auf ein Bestimmten Bereich im Bild setzen

  • CIFilter auf ein Bestimmten Bereich im Bild setzen

    Hallo Leute,
    ich habe einen Blur Effect auf ein Bild gelegt.
    hier einmal der Code:

    Quellcode

    1. // input Core Image
    2. CIImage *inputImage = [[CIImage alloc] initWithImage:self.activityImageView.image];
    3. // create blur filter
    4. CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    5. // set input image and radius
    6. [filter setValue:inputImage forKey:@"inputImage"];
    7. [filter setValue:[NSNumber numberWithFloat:9.0f] forKey:@"inputRadius"];
    8. // get new output image
    9. CIImage *result = filter.outputImage;
    10. // set and create UIImage
    11. self.activityImageView.image = [UIImage imageWithCIImage:result];
    Alles anzeigen



    Ich will aber nicht das dass ganze Bild so einen Blur Effect bekommt,
    ich will nur das der untere teil des Bildes diesen Effect bekommt wie kann man das am besten realisieren ?
    Ich hoffe mal es ist nicht so kompliziert wie ich denke ^^.


    Ich bedanke mich schon einmal im voraus für die Hilfe.
    MFG Marius
  • Hm, der Filter wird meines Erachtens immer auf das gesamte Bild angewendet.D.h. irgendwie aufteilen, und dann auf den Teil rechnen, danach wieder zusammenführen. Sieht aber in dem Beispiels des Blur etwas doof aus, weil es da ne harte kannte gibt. Da müsste man noch zusätzlich mit ner Vignette arbeiten. Was ist denn das Ziel?

    Bei Apple gibt es nen iOS only Beispiel mit sowas: developer.apple.com/library/ma…es/ci_filter_recipes.html und hier scrollen zu White Vignette for Faces Filter Recipe (iOS only)

    volker
  • ich habe einen View der schwarz transparent ist über das Bild gelegt und darauf ist noch mal Text es würde besser ausschauen wenn der teil der vom View verdeckt ist diesen blur effect hat.
    aber danke für den Link den schaue ich mir gleich einmal an :D
  • kurze zwischen frage ich schneide das Bild gerade aus das geht schon so

    Quellcode

    1. CIImage *inputImage = [[CIImage alloc] initWithCGImage:
    2. CGImageCreateWithImageInRect(self.activityImageView.image.CGImage, CGRectMake(0, 420, 360 , 60))];

    oder gibt es noch eine bessere Lösung ?
  • Zum weichen Verlauf vs. harte Kante:

    CALayer hat eine Property mask mit deren Hilfe man einen Layer in seiner Form "beschneiden" kann.
    Das klappt aber nicht nur mit sichtbar/unsichtbar pro Pixel, sondern kann auch Zwischenstufen annehmen.

    Zeichnet man in ein CGImage nun mithilfe von CGContextDrawLinearGradient einen Verlauf und weist dies der view.layer.mask zu,
    hat man einen schönen sichtbar zu unsichtbar Verlauf.
  • Klar kann man das auch mit anderen Techniken machen, man kann aber auch in CI bleiben: Du kannst den zu blurrenden Teil per CICrop ausschneiden, blurren und dann per CISourceOverCompositing über das Originalbild packen. So gibt es eine weiche Kante, erst Blur dann Crop erzeugt eine harte. Angehängt ein Quartz Composer-Screenshot, der ist sehr praktisch zum Testen von Core Image-Zeugs.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Klar kann man das auch mit anderen Techniken machen, man kann aber auch in CI bleiben: Du kannst den zu blurrenden Teil per CICrop ausschneiden, blurren und dann per CISourceOverCompositing über das Originalbild packen. So gibt es eine weiche Kante, erst Blur dann Crop erzeugt eine harte. Angehängt ein Quartz Composer-Screenshot, der ist sehr praktisch zum Testen von Core Image-Zeugs.

    So würde ich das auch machen, einfach den geblurten Teil auf das original drauf pinseln, nicht das original teilen, einfach so lassen wie es ist.
  • muss jetzt leider noch einmal nach fragen aber ich finde den Fehler nicht :(

    Quellcode

    1. // input Core Image
    2. CIImage *inputImage = [[CIImage alloc] initWithImage:self.activityImageView.image];
    3. // bottom image cut out
    4. CIVector *cropRect =[CIVector vectorWithX:50 Y:50 Z: 320 W: 60];
    5. CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"];
    6. [cropFilter setValue:inputImage forKey:@"inputImage"];
    7. [cropFilter setValue:cropRect forKey:@"inputRectangle"];
    8. CIImage *bottomImage = cropFilter.outputImage;
    9. // create blur filter
    10. CIFilter *blurfilter = [CIFilter filterWithName:@"CIGaussianBlur"];
    11. // set input image and radius
    12. [blurfilter setValue:bottomImage forKey:@"inputImage"];
    13. [blurfilter setValue:[NSNumber numberWithFloat:2.0f] forKey:@"inputRadius"];
    14. // get new output image
    15. CIImage *blurImage = blurfilter.outputImage;
    16. CIFilter *sourceOverCompositingFilter = [CIFilter filterWithName:@"CISourceOverCompositing"];
    17. [sourceOverCompositingFilter setValue:blurImage forKey:@"inputImage"];
    18. [sourceOverCompositingFilter setValue:inputImage forKey:@"inputBackgroundImage"];
    19. CIImage *result = sourceOverCompositingFilter.outputImage;
    20. self.activityImageView.image = [UIImage imageWithCIImage:result];
    Alles anzeigen


    danke noch einmal

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Piper ()

  • @Piper: Konnte deinen zuletzt geposteten Code auch verwenden. Hänge nur gerade an dem Problem, die Position anzugeben, an der das Bild ausgeschnitten werden soll.

    Quellcode

    1. ​CIVector *cropRect =[CIVector vectorWithX:50 Y:50 Z: 320 W: 60];

    ...da kann ich bei X und Y angeben was ich will, der Ausschnitt ändert sich nicht??