我需要基于纯色(背景)和半透明图像的合并生成新图像。 所有图像都是半透明的,因此都将与纯色融合。
我尝试过:
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;
}
如果我尝试pOpacity 0.5看不到红色,则pOpacity为0时它将返回黑色。
即使我尝试使用g.CompositingMode = CompositingMode.SourceOver,它也只会生成半透明的图像,而忽略红色背景。
答案 0 :(得分:0)
如果要平铺图像,则需要使用TextureBrush
和Graphics.FillRectangle
而不是Drawimage
。您的代码应为:
private void BlendImageWithWindowBackgoundColor( Image pImage, float pColorOpacity ) {
Image mResult = null;
Image tempImage = null; //we will set the opacity of pImage to pColorOpacity and copy
//it to tempImage
if( pImage != null ) {
Graphics g;
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 );
tempImage = new Bitmap( pImage.Width, pImage.Height, PixelFormat.Format32bppArgb );
g = Graphics.FromImage( tempImage );
g.Clear( Color.Transparent );
//setting pColorOpacity to pImage and drawing to tempImage
g.DrawImage( pImage, new Rectangle( 0, 0, tempImage.Width, tempImage.Height ),
0, 0, pImage.Width, pImage.Height, GraphicsUnit.Pixel, imageAttributes );
g.Dispose();
g = null;
//now we will tile the tempImage
TextureBrush texture = new TextureBrush( tempImage );
texture.WrapMode = WrapMode.TileFlipXY;
mResult = new Bitmap( Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height,
PixelFormat.Format32bppArgb );
g = Graphics.FromImage( mResult );
g.Clear( Color.Red ); //<--This is the color i want merged as background!
g.FillRectangle( texture, new Rectangle( 0, 0, mResult.Width, mResult.Height ) );
g.Dispose();
g = null;
tempImage.Dispose();
tempImage = null;
}
return mResult;
}