2012-04-24 60 views
2

我使用與opencv Xcode中,我得到這個方法從IplImage結構轉換成的UIImage:<Error>:CGImageCreate:無效圖像位/像素:8

-(UIImage *)UIImageFromIplImage:(IplImage *)image { 
NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize]; 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 
CGImageRef imageRef = CGImageCreate(image->width, image->height, 
         image->depth, image->depth * image->nChannels, image->widthStep, 
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault, 
provider, NULL, false, kCGRenderingIntentDefault); 
UIImage *ret = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp]; 
CGImageRelease(imageRef); 
CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorSpace); 
return ret; 
} 

的問題是,當我通過任何圖像此方法(PNG,JPG,TIFF)出現此錯誤 :CGImageCreate:無效圖像位/像素:8,請幫助我解決該錯誤,謝謝。

回答

1

從我在我的應用程序中完成的工作中,您實際上需要在圖像數據中提供一個alpha值。我所做的是將數據從opencv結構中取出,添加一個alpha值並創建CGImage。下面是我用C++ API使用(如果你堅持到C只需更換調用由指針aMat.ptr <>(Y)到第y行的第一像素)的代碼:

// Colorspace 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

unsigned char* data = new unsigned char[4*aMat.cols*aMat.rows]; 
for (int y = 0; y < aMat.rows; ++y) 
{ 
    cv::Vec3b *ptr = aMat.ptr<cv::Vec3b>(y); 
    unsigned char *pdata = data + 4*y*aMat.cols; 

    for (int x = 0; x < aMat.cols; ++x, ++ptr) 
    { 
     *pdata++ = (*ptr)[2]; 
     *pdata++ = (*ptr)[1]; 
     *pdata++ = (*ptr)[0]; 
     *pdata++ = 0; 
    } 
} 

// Bitmap context 
CGContextRef context = CGBitmapContextCreate(data, aMat.cols, aMat.rows, 8, 4*aMat.cols, colorSpace, kCGImageAlphaNoneSkipLast); 

CGImageRef cgimage = CGBitmapContextCreateImage(context); 

CGColorSpaceRelease(colorSpace); 
CGContextRelease(context); 
delete[] data; 

混洗部分是必要的,因爲OpenCV處理BGR圖像,而Quartz期望RGB。

1

如果你的形象是灰色的(不RGBA),使用此:

colorSpace = CGColorSpaceCreateDeviceGray();