Como hacer un semitransparente System.Drawing.Image?
-
18-09-2019 - |
Pregunta
System.Drawing.Graphics.DrawImage
pega una imagen en otra. Pero no pude encontrar una opción de transparencia.
Ya he llamado todo lo que quiero en la imagen, sólo quiero que sea translúcida (alfa-transparencia)
Solución
No hay ninguna opción "transparencia" porque lo que estamos tratando de hacer que se llama Fundido alfa.
public static class BitmapExtensions
{
public static Image SetOpacity(this Image image, float opacity)
{
var colorMatrix = new ColorMatrix();
colorMatrix.Matrix33 = opacity;
var imageAttributes = new ImageAttributes();
imageAttributes.SetColorMatrix(
colorMatrix,
ColorMatrixFlag.Default,
ColorAdjustType.Bitmap);
var output = new Bitmap(image.Width, image.Height);
using (var gfx = Graphics.FromImage(output))
{
gfx.SmoothingMode = SmoothingMode.AntiAlias;
gfx.DrawImage(
image,
new Rectangle(0, 0, image.Width, image.Height),
0,
0,
image.Width,
image.Height,
GraphicsUnit.Pixel,
imageAttributes);
}
return output;
}
}
Otros consejos
private Image GetTransparentImage(Image image, int alpha)
{
Bitmap output = new Bitmap(image);
for (int x = 0; x < output.Width; x++)
{
for (int y = 0; y < output.Height; y++)
{
Color color = output.GetPixel(x, y);
output.SetPixel(x, y, Color.FromArgb(alpha, color.R, color.G, color.B));
}
}
return output;
}
He copiado una respuesta desde el enlace Mitch siempre que creo que va a trabajar para mí:
public static Bitmap SetOpacity(this Bitmap bitmap, int alpha)
{
var output = new Bitmap(bitmap.Width, bitmap.Height);
foreach (var i in Enumerable.Range(0, output.Palette.Entries.Length))
{
var color = output.Palette.Entries[i];
output.Palette.Entries[i] =
Color.FromArgb(alpha, color.R, color.G, color.B);
}
BitmapData src = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly,
bitmap.PixelFormat);
BitmapData dst = output.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly,
output.PixelFormat);
bitmap.UnlockBits(src);
output.UnlockBits(dst);
return output;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow