我正在做一些图像处理,在透明的背景上创建一个图像。我正在与OpenCV (C++)和iOS合作。首先,我设置了一个4通道8位矩阵,将所有像素设置为带alpha 0的白色(这是正确的吗?)然后将像素从result
复制到foreground
中
cv::Mat foreground(image.size(),CV_8UC4, cv::Scalar(255,255,255,0));
image.copyTo(foreground, result);
接下来,我需要将这个Mat
转换为一个UIImage
,我所使用的代码是:
+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width
cvMat.rows, //height
8, //bits per component
8 * cvMat.elemSize(), //bits per pixel
cvMat.step[0], //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);
// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
这可以很好地产生我的形象,但我注意到它是不透明的。所以我想用CGImageCreate
代替,我可以用:
CGImageRef imageRef = CGImageCreateWithPNGDataProvider(provider, NULL, false, kCGRenderingIntentDefault);
但是,我不确定CGImageCreateWithPNGDataProvider是否是正确的调用,也不确定提供程序是否为该方法设置了正确的格式。
我还检查了一下,以确保我的imageView.opaque = NO;
。
有谁知道透明地将cv::Mat
转换为PNG
的最简单方法吗?谢谢
*编辑:我还尝试修改原始CGImageCreate
函数中位图信息的一些标志:
kCGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */
kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
kCGImageAlphaLast, /* For example, non-premultiplied RGBA */
kCGImageAlphaFirst, /* For example, non-premultiplied ARGB */
kCGImageAlphaNoneSkipLast, /* For example, RBGX. */
kCGImageAlphaNoneSkipFirst, /* For example, XRGB. */
但是,我得到了一个<Error>: CGImageCreate: invalid image bits/pixel: 24.
错误,我不知道如何解释,因为我用4个通道初始化了cv::Mat foreground
。
发布于 2015-04-08 20:25:49
看起来问题就在于copyTo方法。从医生那里:
该方法将矩阵数据复制到另一个矩阵。在复制数据之前,该方法调用 m.create(this->size(),this->type());
看起来它覆盖了你的前台设置。您需要找到另一种复制位以获得alpha通道的方法。
https://stackoverflow.com/questions/29524440
复制相似问题