Gdiplus: DrawImage not working with alpha channel

  • Thread starter Thread starter GHEORGHE_926
  • Start date Start date
G

GHEORGHE_926

Guest
Hi all,

I need some help from you: I try to render an SVG image on the screen (with alpha channel). The problem is, when I try to draw the image on the screen, I see absolutely nothing.
First of all, my SVG image is loaded correctly, and the ATL CImage from the below code, contains a correct image. The problem starts when I try to use Gdiplus + alpha channel.
For instance, if I use PixelFormat24bppRGB instead of PixelFormat32bppARGB, the image is drawn correctly, but alpha channel is not preserved - a black halo is shown around my image.
Do you see any problem in my code?

PS: I use Win7, 32 bit + Visual Studio 2013 Ultimate.

Many thanks!


void CAppView::OnDraw(CDC* pDC)
{

int width = 600, height = 600;

GError* pError = NULL;

rsvg_init();
g_my_svg = rsvg_handle_new_from_file("d:\\myImage.svg", &pError);
rsvg_handle_get_dimensions(g_my_svg, &g_dimension);


cairo_surface_t *surface = cairo_win32_surface_create_with_dib(CAIRO_FORMAT_ARGB32, width, height);
cairo_t* cr = cairo_create(surface);

rsvg_handle_render_cairo(g_my_svg, cr);

HDC srcHDC = cairo_win32_surface_get_dc(surface);

// Create ATL CImage, then, copy the content of srcHDC in the CImage HDC
CImage image;
image.Create(width, height, 32);

HDC imageHDC = image.GetDC();

TransparentBlt(imageHDC, 0, 0, width, height, srcHDC, 0, 0, width, height, RGB(0, 0, 0));


// Initialize Gdiplus
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// Problems starts from this point.

// Create a Gdiplus bitmap, and copy the content of CImage in bitmap, then write the bitmap on the screen.
Gdiplus::Bitmap bmp(image.GetWidth(), image.GetHeight(), image.GetPitch(), PixelFormat32bppARGB, static_cast<BYTE*>(image.GetBits()));
Gdiplus::Graphics graphics(pDC->GetSafeHdc());
graphics.DrawImage(&bmp, Gdiplus::Rect(0, 0, width, height));



Gdiplus::GdiplusShutdown(gdiplusToken);
image.ReleaseDC();
image.Destroy();
cairo_surface_flush(surface);
cairo_destroy(cr);
cairo_surface_destroy(surface);
}

Continue reading...
 
Back
Top