jingwood / d2dlib

A .NET library for hardware-accelerated, high performance, immediate mode rendering via Direct2D.
MIT License
234 stars 40 forks source link

Bitmap on Bitmap Transparency #71

Open sdreb3421 opened 2 years ago

sdreb3421 commented 2 years ago

When using the DrawBitmap method to draw one bitmap over another, all semi-transparent pixels show up as fully opaque.

g.DrawBitmap(backImage, this.ClientRectangle); g.DrawBitmap(frontImage, new D2DRect(0, 0, frontImage.Width, frontImage.Height), 1, D2DBitmapInterpolationMode.Linear);

image

jingwood commented 2 years ago

Did you have try the alpha channel option?

If your backImage and frontImage are GDI bitmaps, call drawBitmap and pass true to enable alpha channel.

g.DrawGDIBitmap(..., alpha: true, ...);

If your backImage and frontImage are Direct2D Bitmaps, pass true to enable alpha channel when you convert them.

var d2dbmp = Device.CreateBitmapFromGDIBitmap(..., useAlphaChannel: true);
sdreb3421 commented 2 years ago

We are using Direct2D Bitmaps and the alpha channel is set to true.

If the alpha channel is set to false, all transparent pixels in the overlayed image are opaque. If set to true, the fully transparent pixels are transparent, but semi transparent pixels are fully opaque (incorrect layering).

For example, in the image above the coordinate system arrows are surrounded with semi transparent pixels that are showing up as fully opaque whitish pixels. When drawn with GDI+ these are not white.

d2phap commented 2 years ago

I also have the same problem