2011-01-21 58 views

回答

1

這裏是你如何做到這一點。

1)創建一個新的目標與源圖像的尺寸的IplImage對象(GdiPlus ::位圖)

2.)使用lockbits

3.獲取源圖像的​​PixelData取出把手)複製源PixelData取出的目標圖象 - 源圖像的

4)UnlockBits

0

難度在於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; 
}