将图像保存到iPhone时出错

时间:2011-03-09 13:01:25

标签: iphone objective-c opencv

我知道尝试使用openCV进入iPhone / iPad的图像处理我发现了一些很好的教程,但没有很多信息。

好吧,我正在尝试保存从较大图像的ROI裁剪的图像,XCode和Simulator没有报告任何错误,但在我尝试打开使用Finder保存的图像后,它会报告“损坏的文件或格式不识别“错误。

这是用于裁剪和保存图像的代码(它被插入到nashruddin.com的面部识别教程中

cvSetImageROI(image, cvRect(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale));


        /* create destination image
         Note that cvGetSize will return the width and the height of ROI */

        IplImage *img2 = cvCreateImage(cvGetSize(image),
                                       image->depth,
                                       image->nChannels);

        cvCopy(image, img2, NULL);

        cvResetImageROI(image);

        CvAttrList attributes;

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0]; //2
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"prueba.jpg"];

        cvSave([path UTF8String], img2, NULL, NULL, attributes);

提前感谢您提供的任何帮助

塞尔吉奥

3 个答案:

答案 0 :(得分:1)

您应该使用cvSaveImagecvSave以XML / YAML格式保存图像。或者作为选项,您可以使用UIImagePNGRepresentation() / UIImageJPEGRepresentation()获取原始图像数据并获取PNG / JPEG表示,并使用[NSData writeToFile...]

进行保存

要将IplImage转换为UIImage使用:

UIImage*  CreateUIImageFromIplImage(IplImage* ipl_image) {
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSData* data = [NSData dataWithBytes: ipl_image->imageData length: ipl_image->imageSize];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGImageRef imageRef = CGImageCreate(ipl_image->width, ipl_image->height,
                                        ipl_image->depth, ipl_image->depth * ipl_image->nChannels, ipl_image->widthStep,
                                        colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
                                        provider, NULL, false, kCGRenderingIntentDefault);
    UIImage* ret = [UIImage imageWithCGImage: imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    return ret;
}

答案 1 :(得分:1)

似乎源和目标中的颜色空间不同。尝试使用不同的颜色空间,即RGBA,BGRA组合。 或者在你的iplimage上尝试cvCvtColor到CV_RGBA2BGRA

PS:对不起,如果上面的函数和常量的拼写正确性有任何错误。我完全不记得它们

答案 2 :(得分:0)

这是改变颜色顺序的结果,红色和蓝色通道互换。原始图像位于BGRA色彩空间(OpenCV的默认值),您将图像保存为RGB。要解决此问题,请添加

cvCvtColor(垫,垫,CV_BGR2RGBA);

在saveImage语句之前。