2

Xcode で opencv を使用しています。このメソッドを取得して、IplImage から UIImage に変換します。

-(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、そのエラーの解決を手伝ってください、ありがとう。

4

2 に答える 2

3

画像がグレー (RGBA ではない) の場合は、次を使用します。

colorSpace = CGColorSpaceCreateDeviceGray();

于 2013-06-06T09:25:40.183 に答える
2

私のアプリで行ったことから、実際には画像データにアルファ値を提供する必要があります。私がしているのは、opencv 構造体からデータを取り出し、アルファ値を追加して、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 を想定しているため、シャッフル部分が必要です。

于 2012-04-25T11:18:39.330 に答える