Как настроить уровень прозрачности в Image - C#
Формулировка задачи:
Есть несколько Image image1, image2, и т.п. которые "слоями" складываются через g.DrawImage(image1, .....)
Мне нужно управлять общей прозрачностью отдельных Image при сложении и не могу найти либо свойство, либо способ как это сделать.
Нашел вариант для Bitmap
Но функция принимает Bitmap, а не исходный Image.
Если напрямую в Image нельзя ничего сделать с общей полупрозрачностью, то как сконвертировать Image в Bitmap? Везде навалом варианты только из Bitmap в Image....
private Bitmap Image_Alpha(Bitmap image, int a)
{
Bitmap bmp = new Bitmap(image.Width, image.Height);
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
bmp.SetPixel(i, j, Color.FromArgb(a, image.GetPixel(i, j).R, image.GetPixel(i, j).G, image.GetPixel(i, j).B);
}
}
return bmp;
}Решение задачи: «Как настроить уровень прозрачности в Image»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
List<Сhart> chartsList = new List<Сhart>()
{
new Сhart(new Point(0, 200) ) { Color = Color.Red, Width = 4f, Opacity = 120 },
new Сhart(new Point(0, 200) ) { Color = Color.Blue, Width = 2f, Opacity = 200 }
};
private int gridSize = 25;
private Color gridColor = Color.Silver;
private Random rand = new Random();
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
var timer = new System.Windows.Forms.Timer() { Interval = 100 };
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
foreach (var chart in chartsList)
{
var point = chart.PathLine.Last();
point.Offset(rand.Next(1, 5), rand.Next(-5, 6));
chart.PathLine.Add(point);
}
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var gr = e.Graphics;
gr.SmoothingMode = SmoothingMode.HighQuality;
//draw grid
using (var pen = new Pen(gridColor))
{
for (int y = 0; y <= Height; y++)
gr.DrawLine(pen, 0, y * gridSize, Width, y * gridSize);
for (int x = 0; x <= Width; x++)
gr.DrawLine(pen, x * gridSize, 0, x * gridSize, Height);
}
//draw charts
foreach (var chart in chartsList)
chart.Draw(gr);
}
}
class Сhart
{
public List<Point> PathLine { get; set; } = new List<Point>();
public Color Color { get; set; } = Color.Black;
public byte Opacity { get; set; } = 255;
public float Width { get; set; } = 1f;
public Сhart(Point startPoint)
{
PathLine.Add(startPoint);
}
public void Draw(Graphics g)
{
if (PathLine.Count < 2) return;
using (var pen = new Pen(Color.FromArgb(Opacity, Color), Width) { EndCap = LineCap.Round })
g.DrawLines(pen, PathLine.ToArray());
}
}
}