views:

73

answers:

2

Stuck again. :( I have the following code crammed into a procedure invoked when I click on a button on my application main window. I'm just trying to tweak a CIIMage and then display the results. At this point I'm not even worried about exactly where / how to display it. I'm just trying to slam it up on the window to make sure my Transform worked. This code seems to work down through the drawAtPoint message. But I never see anything on the screen. What's wrong? Thanks.

Also, as far as displaying it in a particular location on the window ... is the best technique to put a frame of some sort on the window, then get the coordinates of that frame and "draw into" that rectangle? Or use a specific control from IB? Or what? Thanks again.

// earlier I initialize a NSImage from JPG file on disk.  
// then create NSBitmapImageRep from the NSImage.  This all works fine.
// then ...
CIImage * inputCIimage = [[CIImage alloc] initWithBitmapImageRep:inputBitmap];
if (inputCIimage == Nil)
    NSLog(@"could not create CI Image");
else {
    NSLog (@"CI Image created.  working on transform");
    CIFilter *transform = [CIFilter filterWithName:@"CIAffineTransform"];
    [transform setDefaults];
    [transform setValue:inputCIimage forKey:@"inputImage"];
    NSAffineTransform *affineTransform = [NSAffineTransform transform];
    [affineTransform rotateByDegrees:3];
    [transform setValue:affineTransform forKey:@"inputTransform"];
    CIImage * myResult = [transform valueForKey:@"outputImage"];
    if (myResult == Nil)
        NSLog(@"Transformation failed");
    else {
        NSLog(@"Created transformation successfully ... now render it");

        [myResult drawAtPoint: NSMakePoint ( 0,0 )
                     fromRect: NSMakeRect  ( 0,0,128,128 )
                    operation: NSCompositeSourceOver
                     fraction: 1.0];                    //100% opaque
        [inputCIimage release];
    }
}

Edit #1:

snip - removed the prior code sample mentioned below (in the comments about drawRect), which did not work

Edit #2: adding some code that DOES work, for anyone else in the future who might be stuck on this same thing. Not sure if this is the BEST way to do it ... but it does work for my quick and dirty purposes. So this new code (below) replaces the entire [myResult drawAtPoint ...] message from above / in my initial question. This code takes the image created by the CIImage transform and displays it in the NSImageView control.

NSImage *outputImage;
NSCIImageRep *ir;
ir = [NSCIImageRep imageRepWithCIImage:myResult];
outputImage = [[[NSImage alloc] initWithSize: NSMakeSize(inputImage.size.width, inputImage.size.height)] autorelease];
[outputImage addRepresentation:ir];
[outputImageView setImage: outputImage];  //outputImageView is an NSImageView control on my application's main window
+1  A: 

Drawing on screen in Cocoa normally takes place inside an -[NSView drawRect:] override. I take it you're not doing that, so you don't have a correctly set up graphics context.

JWWalker
So I should move the drawAtPoint message into the drawRect override, and then replace my NSMakeRect definition (0,0,128,128) with the dirtyRect parameter that is passed in? Can you help me with this? If I sandwich my drawRect code between [NSGraphicsContext saveGraphicsState]; and [NSGraphicsContext restoreGraphicsState]; would that work? I'll try to edit my original post with what I'm trying to describe / ask...
Adam
You don't need any NSGraphicsContext stuff in drawRect:, and more importantly you don't call drawRect:. The system calls your drawRect: when it thinks you need to draw, and it sets up the graphics context for you.
JWWalker
So can someone point me to an example of this, somewhere? I'm reading the Apple Docs, and forums, Googling for sample code, etc. etc. But the samples I find don't seem to be from xcode projects / cocoa apps. And I'm not experienced enough with all this to be able to translates the snippets I'm finding into cocoa. Or ... would someone want to write me an example xcode project / cocoa app to: load a JPG file into a bitmap then into CIImage then Transform (like my example above) then display both original and modified image. All with good memory mgmt, OO design, comments. etc. I'll pay!
Adam
Look at the documentation for the CIImage class and see the heading "Related sample code". You should also read the "Cocoa Drawing Guide".
JWWalker
I had already spent hours and hours reading that documentation, prior to posting my question. I could not figure it out, based on that doc. Probably due to inexperience on my part, but regardless I was still stuck. I finally got something going, though, and have edited the original post to reflect it...
Adam
A: 

So one solution to this problem is to create a NSCIImageRep from the CIImage, then add that representation to a new NSImage, then it is easy to display the NSImage in a variety of ways. I've added the code I used up above (see "edit #2"), where I display the "output image" within an NSImageView control. Man ... what a PITA this was!

Adam