4 votes

L'homologue de UIGraphicsGetImageFromCurrentImageContext dans Cocoa de bureau ?

J'essaie de créer une application de peinture simple pour Mac. Sur iOS, j'ai utilisé UIGraphicsGetImageFromCurrentImageContext pour mettre à jour l'image d'un UIImageView lorsque l'on touche à un objet. J'essaie maintenant d'activer la même chose, mais dans une application Mac, je veux faire.. :

myNSImageView.image = UIGraphicsGetImageFromCurrentImageContext(); 

Mais cette fonction n'existe que sur cocoa-touch et pas dans le cadre de cocoa, des conseils sur où/si je peux trouver une fonction similaire dans Cocoa ?

Merci.

Mise à jour

Un peu de code supplémentaire pour être complet.

- (void)mouseDragged:(NSEvent *)event
{

    NSInteger width = canvasView.frame.size.width;
    NSInteger height = canvasView.frame.size.height;

    NSGraphicsContext * graphicsContext = [NSGraphicsContext currentContext];
    CGContextRef contextRef = (CGContextRef) [graphicsContext graphicsPort];

    CGContextRef imageContextRef =  CGBitmapContextCreate(0, width, height, 8, width*4,    [NSColorSpace genericRGBColorSpace].CGColorSpace, kCGImageAlphaPremultipliedFirst); 

    NSPoint currentPoint = [event locationInWindow];

    CGContextSetRGBStrokeColor(contextRef, 49.0/255.0, 147.0/255.0, 239.0/255.0, 1.0);
    CGContextSetLineWidth(contextRef, 1.0);

    CGContextBeginPath(contextRef);
    CGContextMoveToPoint(contextRef, lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(contextRef, currentPoint.x, currentPoint.y);
    CGContextDrawPath(contextRef,kCGPathStroke);

    CGImageRef imageRef = CGBitmapContextCreateImage(imageContextRef);
    NSImage* image = [[NSImage alloc] initWithCGImage:imageRef size:NSMakeSize(width, height)];
    canvasView.image = image;
    CFRelease(imageRef);
    CFRelease(imageContextRef);

    lastPoint = currentPoint;

}

Le résultat que j'obtiens maintenant est que la peinture fonctionne bien dans la partie supérieure de la vue, mais bâcle le reste. Comme sur cette image (la partie rouge devrait être le canvasView) :

enter image description here

2voto

Nico Points 2637
NSInteger width = 1024;
NSInteger height = 768;
CGContextRef contextRef =  CGBitmapContextCreate(0, width, height, 8, width*4, [NSColorSpace genericRGBColorSpace].CGColorSpace, kCGImageAlphaPremultipliedFirst); 

CGContextSetRGBStrokeColor(contextRef, 49.0/255.0, 147.0/255.0, 239.0/255.0, 1.0);
CGContextFillRect(contextRef, CGRectMake(0.0f, 0.0f, width, height));

CGImageRef imageRef = CGBitmapContextCreateImage(contextRef);
NSImage* image = [[NSImage alloc] initWithCGImage:imageRef size:NSMakeSize(width, height)];
CFRelease(imageRef);
CFRelease(contextRef);

2voto

Peter Hosey Points 66275
NSGraphicsContext * graphicsContext = [NSGraphicsContext currentContext];
CGContextRef contextRef = (CGContextRef) [graphicsContext graphicsPort];

CGContextRef imageContextRef =  CGBitmapContextCreate(0, width, height, 8, width*4,    [NSColorSpace genericRGBColorSpace].CGColorSpace, kCGImageAlphaPremultipliedFirst); 

Vous supposez, tout d'abord, qu'il existe un contexte actuel, puis que vous créez un contexte distinct.

CGContextSetRGBStrokeColor(contextRef, 49.0/255.0, 147.0/255.0, 239.0/255.0, 1.0);
CGContextSetLineWidth(contextRef, 1.0);

(etc.)

Et ensuite, vous dessinez dans le contexte que vous supposez exister, et non le contexte que vous avez créé.

CGImageRef imageRef = CGBitmapContextCreateImage(imageContextRef);

Et ensuite, vous créez une image à partir du contexte que vous avez créé et dans lequel vous n'avez jamais puisé.

Arrêtez d'essayer d'obtenir [NSGraphicsContext currentContext] et son port graphique. Vous ne pouvez pas supposer qu'il y a un contexte actuel en dehors de drawRect: de toute façon. Au lieu de cela, puisez dans le contexte que vous avez créé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X