I need to generate a new image based on merge from a solid color (background) and a semi transparent image. All the image will be semi transparent, so it will all blend with a solid color.
I tried:
private Image BlendImageWithWindowBackgoundColor(Image pImage, float pColorOpacity)
{
Image mResult = null;
if (pImage != null)
{
ColorMatrix matrix = new ColorMatrix(new float[][]{
new float[] {1F, 0, 0, 0, 0},
new float[] {0, 1F, 0, 0, 0},
new float[] {0, 0, 1F, 0, 0},
new float[] {0, 0, 0, pColorOpacity, 0}, //opacity in rage [0 1]
new float[] {0, 0, 0, 0, 1F}});
ImageAttributes imageAttributes = new ImageAttributes();
imageAttributes.SetColorMatrix(matrix);
imageAttributes.SetWrapMode(WrapMode.TileFlipXY);
mResult = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(mResult);
g.Clear(Color.Red); //<--This is the color i want merged as background!
g.CompositingMode = CompositingMode.SourceCopy;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(pImage, new Rectangle(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height), 0, 0, pImage.Width, pImage.Height, GraphicsUnit.Pixel, imageAttributes);
}
return mResult;
}
If i try the pOpacity 0.5 cannot see RED, when pOpacity is 0 it returns black.
Even if i try with g.CompositingMode = CompositingMode.SourceOver it only generates a semitransparent image, ignores the red background.
SetWrapMode
? – γηράσκω δ' αεί πολλά διδασκόμε