Transformer une NSView en NSImage

maestricmaestric Membre
10:00 modifié dans API AppKit #1
Comment faire pour transformer une NSView créée dans le code en NSImage ?
Ceci fonctionne, mais est trop lent :

SimpleView *myView2 = [[SimpleView alloc] initWithFrame:NSRectFromString(@&quot;0 0 20 20&quot;)];<br />	<br />NSData *imageData = [myView2 dataWithPDFInsideRect:NSRectFromString(@&quot;0 0 20 20&quot;)];	<br />NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithData:imageData];<br />	<br />NSImage *anImage = [[[NSImage alloc] initWithSize:NSZeroSize] autorelease];<br />[anImage addRepresentation:rep];



Le mini-projet qui va avec :
http://www.maestric.com/shared/cocoa/ViewToImage.zip

Une capture d'écran :
ViewToImageView.jpg

Réponses

  • mars 2006 modifié #2
    Tu peux faire un :

    [webView lockFocus];
    NSBitmapImageRep *bitmap=[[NSBitmapImageRep alloc] initWithFocusedViewRect:r];
    [webView unlockFocus];

    Ou un mais dans ce cas 10.4 uniquement.
    NSBitmapImageRep *bitmap=[self bitmapImageRepForCachingDisplayInRect:rect];
    [self cacheDisplayInRect:rect toBitmapImageRep:bitmap];

    Mais puisque c'est toi qui dessine ta vue tu peux dessiner directement dans un NSImage

    [unNSImage lock];
    {
        [dessine moi un cercle]
    }
    [unNSImage unlock];
  • maestricmaestric Membre
    10:00 modifié #3
    Oui, je veux transformer en NSImage une NSView qui n'apparaà®t pas dans l'interface, mais que je crée "à  la main", dans le code.

    J'ai essayé ceci, pour faire directement la NSImage comme tu le proposes au lieu de passer par une NSView :

    NSImage *anImage = [[[NSImage alloc] initWithSize:NSSizeFromString(@&quot;20 20&quot;)] autorelease];<br /><br />	[anImage setBackgroundColor:[NSColor greenColor]];<br />	[anImage lockFocus];	<br />	[[NSColor greenColor] set];<br />	NSBezierPath *path = [[NSBezierPath alloc] init];<br />		[path setLineWidth:2.3];	<br />		[path moveToPoint:NSPointFromString(@&quot;0 0&quot;)];<br />		[path lineToPoint:NSPointFromString(@&quot;10 10&quot;)];<br />		[path closePath];	<br />	[anImage unlockFocus];<br />	[myImageView setImage:anImage];
    


    Et ça ne fonctionne pas  :-\\ Ni le "background color", ni le trait.
    D'autres idées ?  :(
  • mars 2006 modifié #4
    Bien sur que si ça marche. Déjà  on crée un point et une size avec NSMakePoint(0,0) et NSMakeSize(0,0). Ensuite dessiner un trait vert sur un fond vert risque de ne pas être très visible. Et puis ton path n'est jamais dessiné, tu dois faire un stroke. NSBezierPath *path = [NSBezierPath bezierPath]; est assez.
  • maestricmaestric Membre
    10:00 modifié #5
    o:) Merci beaucoup pour tous ces conseils ! o:)

    En fait je ne voyais rien parce-que comme tu l'as dit je n'avais pas fait de stroke, mais aussi parce-que le "setBackgroundColor" ne fonctionnait pas.

    Je laisse un bout de code complètement fonctionnel pour ceux qui repasseront sur ce topic :
    NSImage *anImage = [[[NSImage alloc] initWithSize:NSMakeSize(50,50)] autorelease];<br />	[anImage lockFocus];	<br />	<br />	[[NSColor redColor] set];<br />	[NSBezierPath fillRect:NSMakeRect(0,0,50,50)];<br />	<br />	[[NSColor greenColor] set];<br />	NSBezierPath *path = [NSBezierPath bezierPath];<br />	[path setLineWidth:3];	<br />	[path moveToPoint:NSMakePoint(0,0)];<br />	[path lineToPoint:NSMakePoint(50,50)];<br />	[path closePath];<br />	[path stroke];<br /><br />	[anImage unlockFocus];<br />	[myImageView setImage:anImage];
    


    Voilà  ce que ça donne :
    ViewToImageView2.jpg
Connectez-vous ou Inscrivez-vous pour répondre.