【问题标题】:Converting GdiPlus::Bitmap to OpenCV IplImage将 GdiPlus::Bitmap 转换为 OpenCV IplImage
【发布时间】:2011-06-12 23:02:18
【问题描述】:

我有一个 24bpp GdiPlus::Bitmap 需要转换为 IplImage (opencv)。 有谁知道如何做到这一点?

【问题讨论】:

    标签: c++ opencv bitmap gdi+


    【解决方案1】:

    困难在于 Gdiplus::Bitmap 在理论上支持许多奇异的像素格式,因此总的来说转换会很冗长。但是,基本情况如下:

    IplImage* GdiPlusBitmapToOpenCvImage(Gdiplus::Bitmap* bmp)
    {
        auto format = bmp->GetPixelFormat();
        if (format != PixelFormat24bppRGB)
            return nullptr;
    
        Gdiplus::Rect rcLock(0, 0, bmp->GetWidth(), bmp->GetHeight());
        Gdiplus::BitmapData bmpData;
    
        bmp->LockBits(&rcLock, Gdiplus::ImageLockModeRead, format, &bmpData);
    
        int buffSz = bmpData.Stride * bmpData.Height;
        int depth = 8, channel = 3;
        IplImage* cvImage = cvCreateImage(CvSize(rcLock.Width, rcLock.Height), depth, channel);
        const unsigned char* src = static_cast<unsigned char*>(bmpData.Scan0);
        std::copy(src, src + buffSz, cvImage->imageData);
    
        bmp->UnlockBits(&bmpData);
        return cvImage;
    }
    

    【讨论】:

      【解决方案2】:

      这是您的问题的答案,唯一的区别是 BitMap 转换为 Mat:Convert Bitmap to Mat

      【讨论】:

        【解决方案3】:

        你可以这样做。

        1.) 创建一个新的目标 IplImage 对象,其尺寸为 Source image (GdiPlus::Bitmap)

        2.) 使用lockbits获取Source image的pixeldata句柄

        3.) 将源像素数据复制到目标图像数据

        4.) 源图像的 UnlockBits

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-28
          • 2016-06-25
          • 2013-05-17
          相关资源
          最近更新 更多