1

画像に線形グラデーションの不透明度を適用したいのですが、取得できるのは画像の上に描かれたグラデーションだけです。

ここに画像の説明を入力

このスタック オーバーフローの投稿に続いて、PictureBox から継承するユーザー コントロールを作成し、OnPaint メソッドをオーバーライドしました。

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        LinearGradientBrush linearGradientBrush = new LinearGradientBrush(
            this.ClientRectangle,
            Color.FromArgb(255, Color.White),
            Color.FromArgb(0, Color.White),
            0f);
        e.Graphics.FillRectangle(linearGradientBrush, this.ClientRectangle);
    }

ただし、それは単に画像の上に線形グラデーションをペイントするだけです。

線形グラデーションの不透明度を画像に適用するにはどうすればよいですか?

XAML () で例を見つけましたが、winform ではありません。

4

1 に答える 1

3

OnPaintユーザー コントロールを使用してイベントをオーバーライドする必要はありません。空白の画像からグラフィック オブジェクトを作成し、画像操作を行って、その画像を に割り当てるだけPicturePoxです。

最初に linearGradientBrush を背景に描画してから、その上に画像を描画します。画像操作の順序には常に注意してください。

FileInfo inputImageFile = new FileInfo(@"C:\Temp\TheSimpsons.png");
Bitmap inputImage = (Bitmap)Bitmap.FromFile(inputImageFile.FullName);

// create blank bitmap with same size
Bitmap combinedImage = new Bitmap(inputImage.Width, inputImage.Height);

// create graphics object on new blank bitmap
Graphics g = Graphics.FromImage(combinedImage);

// also use the same size for the gradient brush and for the FillRectangle function
LinearGradientBrush linearGradientBrush = new LinearGradientBrush(
    new Rectangle(0,0,combinedImage.Width, combinedImage.Height),
    Color.FromArgb(255, Color.White), //Color.White,
    Color.FromArgb(0, Color.White), // Color.Transparent,
    0f);
g.FillRectangle(linearGradientBrush, 0, 0, combinedImage.Width, combinedImage.Height);

g.DrawImage(inputImage, 0,0);

previewPictureBox.Image = combinedImage;

結果

フォームの背景色が黒で、例の画像が透明になった結果。

EDIT:私は意図を誤解している可能性があり、WPFのような簡単な方法を見つけていないかもしれませんが、それほど難しいことではありません.

FileInfo inputImageFile = new FileInfo(@"C:\Temp\TheSimpsons.png");
Bitmap inputImage = (Bitmap)Bitmap.FromFile(inputImageFile.FullName);

// create blank bitmap
Bitmap adjImage = new Bitmap(inputImage.Width, inputImage.Height);

// create graphics object on new blank bitmap
Graphics g = Graphics.FromImage(adjImage);

LinearGradientBrush linearGradientBrush = new LinearGradientBrush(
    new Rectangle(0, 0, adjImage.Width, adjImage.Height),
    Color.White,
    Color.Transparent,
    0f);

Rectangle rect = new Rectangle(0, 0, adjImage.Width, adjImage.Height);
g.FillRectangle(linearGradientBrush, rect);

int x;
int y;
for (x = 0; x < adjImage.Width; ++x)
{
    for (y = 0; y < adjImage.Height; ++y)
    {
        Color inputPixelColor = inputImage.GetPixel(x, y);
        Color adjPixelColor = adjImage.GetPixel(x, y);
        Color newColor = Color.FromArgb(adjPixelColor.A, inputPixelColor.R, inputPixelColor.G, inputPixelColor.B);
        adjImage.SetPixel(x, y, newColor);
    }
}
previewPictureBox.Image = adjImage;

ここに画像の説明を入力

于 2016-11-21T11:55:13.600 に答える