Нет необходимости использовать пользовательский контроль и отменять событие 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;
Wow! Я думал, что, поскольку никто не ответил на этот вопрос, когда я впервые спросил его, никто никогда не захочет; Я приятно удивлен, что вы нашли этот вопрос так долго и ответили ему: спасибо! Итак, я понимаю, что вы говорите: делайте это по одному пикселю за раз. Хорошо, я попробую. Благодаря, –