2015-04-02 40 views
0

我使用Xcode並想將灰度圖像加載到程序中,但我遇到了問題。CGContextDrawImage:當加載灰度圖像時無效的上下文0x0

此前我已經將灰度IplImage(大小,8,1)轉換爲UIimage並存儲爲jpg。現在我想恢復過程來取回IplImage。

我獲得的UIImage做

UIImage *uiimage1 = [UIImage imageNamed:@"IMG_1.JPG"]; 

然後我用下面的函數。

- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image { 
// Getting CGImage from UIImage 
CGImageRef imageRef = image.CGImage; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
// Creating temporal IplImage for drawing 
IplImage *iplimage = cvCreateImage(
            cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4 
            ); 
// Creating CGContext for temporal IplImage 
CGContextRef contextRef = CGBitmapContextCreate(
               iplimage->imageData, iplimage->width, iplimage->height, 
               iplimage->depth, iplimage->widthStep, 
               colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault 
               ); 
// Drawing CGImage to CGContext 
CGContextDrawImage(
        contextRef, 
        CGRectMake(0, 0, image.size.width, image.size.height), 
        imageRef 
        ); 
CGContextRelease(contextRef); 
CGColorSpaceRelease(colorSpace); 

// Creating result IplImage 
IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3); 
cvCvtColor(iplimage, ret, CV_RGBA2BGR); 
cvReleaseImage(&iplimage); 

return ret; 

}

也能正常工作,用於與標準的RGBA通道加載彩色圖像,但是我有一些問題時,我想只用1個頻道並沒有alpha通道來加載灰度圖像。

我試圖然而改變色彩空間到CGColorSpaceCreateDeviceGray(),改變從4到1信道的數量和註釋掉cvCvtColor和返回的IplImage *的IplImage直接

,我仍然有錯誤,CGContextDrawImage:無效背景爲0x0

我覺得可能是有CGBitmapContextCreate和可能出毛病BITMAPINFO一個問題..

我嘗試了一些組合,如kCGBitmapByteOrderDefault | kCGImageAlphaNone但他們沒有工作。

任何想法我該怎麼做,請嗎?提前致謝!

回答

0

調查CGBitmapContextCreate的文檔。 (在xCode CMD +右鍵點擊我認爲看到文檔)

你是否設置size_t bytesPerRow爲這種情況? RGBA是8 + 8 + 8 + 8位長,只有Alpha是8

CGContextRef CGBitmapContextCreate(無效*數據,爲size_t寬度,爲size_t高度,爲size_t bitsPerComponent,爲size_t bytesPerRow,CGColorSpaceRef空間,CGBitmapInfo BITMAPINFO);

相關問題