CALayer "fotografieren"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CALayer "fotografieren"

    Hallo,

    ich brauche ein Bild von einem CALayer, bzw. des Layertrees - was nicht so gut gelingen will:

    Quellcode

    1. - (IBAction) knob:(id)sender
    2. {
    3. CGContextRef ctx;
    4. CGImageRef cgi;
    5. CALayer *l = [[[self imageMill] rootLayer] backgroundLayer];
    6. CGSize s = [l frame].size;
    7. ctx = OCCreateARGBBitmapContextOfSize(s.width, s.height);
    8. if (ctx == NULL)
    9. {
    10. NSLog(@"Error creating context");
    11. return;
    12. }
    13. CGContextSaveGState(ctx);
    14. [l drawInContext: ctx];
    15. cgi = CGBitmapContextCreateImage (ctx);
    16. NSImage *image = OCCGImageToNSImage(cgi);
    17. CGContextRestoreGState(ctx);
    18. NSLog(@"image snap %@", image);
    19. [[image TIFFRepresentation] writeToFile: @"/Users/manfred/Desktop/asnap.tiff" atomically: YES];
    20. }
    Alles anzeigen


    Das funktioniert zwar mit dem BitmapContext und dann das CGImage erzeugen lassen, aber nur bei CALayern, die ich selbst male :( . Bei denen, die mit setContents: ein Bild mitbekommen und nicht selbst gezeichnet werden, bekomme ich nur ein leeres (transparentes) Bild.

    Hat jemand ne Ahnung, wie man das hinbekommt?


    Vielen Dank schon mal
    Manfred
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Probiere mal renderInContext: aus. Das hat bei zumindest auf dem Telefon funktioniert. Mit der Fallunterscheidung konnte ich beide Fälle abfrühstücken:

    Quellcode

    1. if([theLayer.delegate respondsToSelector:@selector(drawLayer:inContext:)] && theLayer.contents == nil) {
    2. [theLayer drawInContext:theContext];
    3. }
    4. else {
    5. [theLayer renderInContext:theContext];
    6. }
    „Meine Komplikation hatte eine Komplikation.“
  • Ansonsten fiele mir noch die Hardcore-Variante ein, den Layertree in einem OpenGL-View zu hosten, und dann mittels eines FBOs/PBOs oder einer Textur des views abzuholen...

    Die kommen ja auch auf die Methode mit dem Bitmap Context. Aber danke.

    Da wär meine Hardcorevariante aber glaub einfacher - Screenshot des entsprechenden Bereichs.

    Aber ich denke ich werde das mit CA aufgeben. Ausgangspunkt ist, das ich mehrere Bilder zusammensetze und mit einer Perspektive versehe. Ich hab das mit CoreGraphics und CoreImage gemacht. Hat gut geklappt, aber wenn der "Schlimmste anzunehmende User" 3000x2000er Fotos reinkippt, gehts voll in die Knie, wenn man ein paar von den Fotos nebeneinander pappt, am Perspektivenregler zuckelt und dann das Ganze in der View mit 800x600 Pixel zeichnet. Voll für den Arsch, so ein i5 MBP mit super duper GPU.

    Ich werde die Bilder für eine "Arbeitkopie" runterskalieren. Der Export wird dann mit den Fotos in Originalgröße gemacht. Das abfotografieren des Layers oder Screens würde ja auch erhebliche Verluste bringen.


    Gruß
    Manfred
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Nee, hat die Perspektive auch nicht draufgerendert.

    Aber ich habs jetzt mit Bitmaps ordentlich performant hinbekommen. Die Sache ich hauptsächlich in die Knie gegangen, weil ich öfters CGIrgendwas nach CIIrgendwas konvertiert habe. Da wird dann wohl viel zwischen Grafikkarte und RAM hin und her kopiert. Nebenbei geht Apple dabei auch sehr, sehr großzügig mit Arbeitsspeicher um. Das waren eindeutig die, die den Speicherverbrauch durch ein mal am Slider zerren auf 2GB hochgeschraubt haben.
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.