Gdiplus: DrawImage not working?

Started by
2 comments, last by GHEORGHE_926 7 years, 3 months ago

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 start 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);
}
Advertisement

Try PixelFormat32bppPARGB, premultiplied ARGB format.

Hi jariRG,

I already tried, no change. I tried also to load data into that gdiplus::bitmap in many other ways, but again, no change. If that bitmap contains alpha channel, DrawImage shows nothing. It's wird because, for instance, if I create that bitmap using another constructor like:

Gdiplus::Bitmap bmp(image.GetWidth(), image.GetHeight(), PixelFormat32bppARGB);

then, I set color to some pixels, like this:

for (int x = 0; x < 300; x++)

for (int y = 0; y < 300; y++)

bmp.SetPixel (x, y, myColor);

DrawImage works perfect in this case.

Try PixelFormat32bppPARGB, premultiplied ARGB format.

Actually the problem was related to the way of copying from srcHDC to ImageHDC. I have done like this:

HDC svgDC = cairo_win32_surface_get_dc(surface);

image.Create(width, height, 32);

image.SetHasAlphaChannel(TRUE);

HDC imageHDC = image.GetDC();

BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(imageHDC, 0, 0, width, height, svgDC, 0, 0, width, height, blend);

image.ReleaseDC();

Best regards!

This topic is closed to new replies.

Advertisement