首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Mat (OpenCV)生成透明的PNG

从Mat (OpenCV)生成透明的PNG
EN

Stack Overflow用户
提问于 2015-04-08 20:12:03
回答 1查看 2.1K关注 0票数 1

我正在做一些图像处理,在透明的背景上创建一个图像。我正在与OpenCV (C++)和iOS合作。首先,我设置了一个4通道8位矩阵,将所有像素设置为带alpha 0的白色(这是正确的吗?)然后将像素从result复制到foreground

代码语言:javascript
运行
复制
 cv::Mat foreground(image.size(),CV_8UC4, cv::Scalar(255,255,255,0));
 image.copyTo(foreground, result);

接下来,我需要将这个Mat转换为一个UIImage,我所使用的代码是:

代码语言:javascript
运行
复制
+(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代替,我可以用:

代码语言:javascript
运行
复制
CGImageRef imageRef = CGImageCreateWithPNGDataProvider(provider, NULL, false, kCGRenderingIntentDefault);

但是,我不确定CGImageCreateWithPNGDataProvider是否是正确的调用,也不确定提供程序是否为该方法设置了正确的格式。

我还检查了一下,以确保我的imageView.opaque = NO;

有谁知道透明地将cv::Mat转换为PNG的最简单方法吗?谢谢

*编辑:我还尝试修改原始CGImageCreate函数中位图信息的一些标志:

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 20:25:49

看起来问题就在于copyTo方法。从医生那里:

该方法将矩阵数据复制到另一个矩阵。在复制数据之前,该方法调用 m.create(this->size(),this->type());

看起来它覆盖了你的前台设置。您需要找到另一种复制位以获得alpha通道的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29524440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档