Eliminar el color de fondo negro de un bitmap.

Necesito eliminar el color de fondo negro de un bitmap en C # VS2013.

Es así como dibujo algunos puntos en un canvas. El canvas es negro y solo necesito cambiar el canvas para que sea transparente mientras mantengo los puntos de colores en él sin ningún cambio.

Obtuve la solución en: Cómo eliminar el color de fondo blanco de Bitmap

Bitmap capcha = new Bitmap(@"C:/image.png"); capcha.MakeTransparent(Color.Black); 

Pero, el fondo todavía tiene un color gris como una niebla que cubre los puntos de la imagen.

¿Cómo eliminarlo?

ACTUALIZACIÓN utilicé el código:

 ImageAttribute imageAttribute = new ImageAttribute(); imageAttribute.SetGamma(0.5f, ColorAdjustType.Bitmap); gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttribute ); 

Tengo lo mismo.

Más actualización de código C # para dibujar una imagen:

  System.Drawing.Bitmap canvasImage = new System.Drawing.Bitmap(xSize, ySize, System.Drawing.Imaging.PixelFormat.Format32bppArgb); canvasImage.MakeTransparent(Color.Black); Graphics g = Graphics.FromImage(canvasImage); System.Drawing.Bitmap tempImage = myDrawImageFunction(myPoints); g.Clear(Color.Transparent); // this only give me an empty image without any points on it. But, if I uncomment it, I will have an image with black background. // my understanding about g.DrawImage() is to draw points on tempImage // after clearing the background. But, the image still have a foggy covering on the image. g.DrawImage(tempImage, new System.Drawing.PointF(x_position, y_position)); 

Quiero tener un fondo transparente para “tempImage” antes de dibujar puntos.

La imagen de ejemplo tiene un fondo que debe eliminarse, pero los puntos de colores de la imagen deben mantenerse sin ningún cambio.

Imagen con el fondo negro que debe eliminarse pero los puntos de colores deben mantenerse.

Esto hará el trabajo:

 public Color MakeTransparent(Color c, int threshold) { // calculate the weighed brightness: byte val = (byte)((cR * 0.299f + cG * 0.587f + cB * 0.114f)); return val < threshold ? Color.FromArgb(0, cR, cG, cB) : c; } 

Puede usarlo en un bucle doble sobre los píxeles, pero para obtener resultados rápidos, debe llamarlo desde el código de esta publicación (¡la segunda parte!) Que usa LockBits .

Cambia esto

 ModifyHue hueChanger = new ModifyHue(MaxChannel); 

a la nueva función:

 ModifyHue hueChanger = new ModifyHue(MakeTransparent); 

y llámelo con un umbral adecuado, tal vez 10 o 20 ...

 c = hueChanger(c, 20); 

La función omite la llamada a la función MakeTransparent del sistema y establece directamente el canal alfa de cada píxel en 0.

Si desea crear un color uniforme en lugar de uno transparente, debe ser fácil de modificar (por ejemplo, devolviendo Color.FromArgb(255, 0, 0, 0) para negro sólido)

Tenga en cuenta que, si bien el código en la publicación vinculada toma formatos de 24 y 32 bbp, definitivamente no debería guardar como JPG, ya que esto volverá a introducir artefactos y el resultado no funcionará bien, por ejemplo, con un color TransparencyKey .

En lugar de eso, guárdelo como PNG, como sugiere Hans.

Espero que puedas modificar el código del botón a una función 🙂