C++ 将GdiPlus::位图转换为OpenCV IplImage
我有一个24bppC++ 将GdiPlus::位图转换为OpenCV IplImage,c++,opencv,bitmap,gdi+,C++,Opencv,Bitmap,Gdi+,我有一个24bppGdiPlus::Bitmap,我需要将它转换成IplImage(opencv)。 有人知道如何做到这一点吗?以下是您可以做到的方法 1.)使用源图像(GdiPlus::位图)的尺寸创建新的目标IplImage对象 2.)使用锁定位获取源图像的像素数据句柄 3.)将源像素数据复制到目标图像数据 4.)解锁源图像的位这里是对您的问题的答案,唯一的区别是位图转换为Mat:困难在于Gdiplus::BitMap在理论上支持许多奇异的像素格式,因此在一般情况下,转换将是冗长的。但是,基
GdiPlus::Bitmap
,我需要将它转换成IplImage
(opencv)。
有人知道如何做到这一点吗?以下是您可以做到的方法 1.)使用源图像(GdiPlus::位图)的尺寸创建新的目标IplImage对象 2.)使用锁定位获取源图像的像素数据句柄 3.)将源像素数据复制到目标图像数据
4.)解锁源图像的位这里是对您的问题的答案,唯一的区别是位图转换为Mat:困难在于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;
}
IplImage*GdiPlusBitmapToOpenCvImage(Gdiplus::Bitmap*bmp)
{
自动格式化=bmp->GetPixelFormat();
如果(格式!=像素格式24bpprgb)
返回空ptr;
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深度=8,通道=3;
IplImage*cvImage=cvCreateImage(CvSize(rcLock.Width,rcLock.Height)、深度、通道);
const unsigned char*src=static_cast(bmpData.Scan0);
std::copy(src,src+buffSz,cvImage->imageData);
bmp->解锁位(&bmpData);
返回图像;
}