#include <windows.h>
#include <gdiplus.h>
#include <opencv2/opencv.hpp>
#pragma comment(lib, "gdiplus")
using namespace cv;
using namespace Gdiplus;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCSTR lpszClass = "Mat and Bitmap";
Mat originalImage;
Mat bitmapToMat;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
ULONG_PTR gpToken;
GdiplusStartupInput gpsi;
if (GdiplusStartup(&gpToken, &gpsi, NULL) != Ok) {
MessageBox(NULL, TEXT("GDI+ start-up error."), TEXT("GDI+ Error"), MB_OK);
return 0;
}
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); //(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = (WNDPROC)WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
630, 960, NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&Message, 0, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
GdiplusShutdown(gpToken);
return (int)Message.wParam;
}
Mat BitmapToMat(Bitmap* bitmap)
{
PixelFormat pixelFormat = bitmap->GetPixelFormat();
if (pixelFormat != PixelFormat32bppARGB) // PixelFormat24bppRGB
return Mat();
int width = bitmap->GetWidth();
int height = bitmap->GetHeight();
Gdiplus::Rect rectLock(0, 0, width, height);
Gdiplus::BitmapData bitmapData;
if (bitmap->LockBits(&rectLock, Gdiplus::ImageLockModeRead, pixelFormat, &bitmapData) != Gdiplus::Ok)
return Mat();
Mat mat = Mat(height, width, CV_8UC4, // CV_8UC3
static_cast<unsigned char*>(bitmapData.Scan0), bitmapData.Stride).clone();
bitmap->UnlockBits(&bitmapData);
return mat;
}
void OnPaint(HDC hdc)
{
Graphics G(hdc);
// Mat to Bitmap
cvtColor(originalImage, originalImage, COLOR_BGR2BGRA);
Bitmap bitmap((INT)originalImage.size().width, (INT)originalImage.size().height, (INT)originalImage.step,
PixelFormat32bppARGB, originalImage.data);
G.DrawImage(&bitmap, 0, 0, bitmap.GetWidth(), bitmap.GetHeight());
// Bitmap to Mat
bitmapToMat = BitmapToMat(&bitmap);
imshow("BitmapToMat", bitmapToMat);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (iMessage) {
case WM_CREATE:
originalImage = imread("Barbara.jpg");
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}