开发者

call c++ class within objective c one

I wrote c++ class that return uiimage (I made sure that it doesn't return null) and I am trying to call it from objective c obe (uiview based classs) as below code, the problem is that no image be displayed any suggestion to solve that , also when put the code of c++ class a开发者_运维知识库t the objective c class the image appear

images imaging = new images(); // the c++ class .mm file

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask,
                                                     YES);

NSString *fullPath = [[paths lastObject] stringByAppendingPathComponent:ImageFileName];

NSLog(fullPath);


@try {
 UIView* holderView = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width,self.view.bounds.size.height)];


    viewer = [[UIImageView alloc] initWithFrame:[holderView frame]];
    [viewer setImage:imaging->LoadImage(fullPath)];
    viewer.contentMode = UIViewContentModeScaleAspectFit;
    //holderView.contentMode = UIViewContentModeScaleAspectFit ;
    [holderView addSubview:viewer];

    [self.view addSubview:holderView];  


}
@catch (NSException * e) {
    NSLog(@"this was what happened: %a ",e);
}

this is a part of the loadimage, which create image from the buffer data

try{ ...............

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,MyFilter->GetOutput()->GetBufferPointer(), bufferLength, NULL); if(colorSpaceRef == NULL) { NSLog(@"Error allocating color space"); CGDataProviderRelease(provider); }

        CGImageRef iref = CGImageCreate(Width,Height,bitsPerComponent,bitsPerPixel,bytesPerRow, colorSpaceRef,bitmapInfo,provider,NULL,YES,renderingIntent);


        CGContextRef context = NULL;

        if ((Comptype==itk::ImageIOBase::SHORT)||(Comptype==itk::ImageIOBase::USHORT))
        {
            context = CGBitmapContextCreate(MyFilter->GetOutput()->GetBufferPointer(), 
                                            Width, 
                                            Height, 
                                            bitsPerComponent, 
                                            bytesPerRow, 
                                            colorSpaceRef, 
                                            bitmapInfo);
        }
        else
        {
            context = CGBitmapContextCreate(myimg->GetBufferPointer(), 
                                            Width, 
                                            Height, 
                                            bitsPerComponent, 
                                            bytesPerRow, 
                                            colorSpaceRef, 
                                            bitmapInfo);
        }

        if(context == NULL)
        {
            NSLog(@"Error context not created");
        }

        //Create the UIImage to be displayed
        UIImage * uiimage = nil;
        if (context) 
        {

            CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, Width, Height), iref);

            CGImageRef imageRef = CGBitmapContextCreateImage(context);
            //if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) {

                //float scale = [[UIScreen mainScreen] scale];
                //uiimage = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp];


            //} else {
                uiimage = [UIImage imageWithCGImage:imageRef];
            //}

            CGImageRelease(imageRef);   
            CGContextRelease(context);  
        }



        CGColorSpaceRelease(colorSpaceRef);
        CGImageRelease(iref);
        CGDataProviderRelease(provider);


        return uiimage;
        //return uiimage;

    }

    catch (itk::ExceptionObject & e)

    {
        throw(e);

    }


The code looks okay - the Objective C, Objective C++ and C++ code should all work together fine, so I'd guess the problem may be within images::LoadImage(), even though it works separately - could we see that function?


Did you confirm that LoadImage returns UIImage object?

UIImage *image = imaging->LoadImage(fullPath)];
NSLog(@"className of image is \"%@\"", [image className]);
[viewer setImage:image];


Sometimes the Obj-C objects created by class functions in Cocoa are autoreleased. You may need to do:

uiimage = [UIImage imageWithCGImage:imageRef];
[uiimage retain];

Since this is on iOS I believe this is required, since iOS does not have garbage collection like OS X Cocoa.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜