Pregunta

Estoy tratando de crear una página que me permita tomar una imagen de entrada y generar una máscara a partir de ella. La entrada sería un PNG indexado con un fondo transparente. La imagen resultante sería negra donde el original era transparente y transparente donde la imagen original fuera opaca.

He hecho una manipulación de imágenes muy básica en asp.net pero no estoy seguro de cómo proceder. Espero que haya alguna solución más rápida que ir píxel por píxel.

Si alguien puede señalarme en la dirección correcta, realmente lo agradecería.

¿Fue útil?

Otros consejos

Ok, tengo una solución de trabajo que usa transformaciones. Para ser sincero, no entiendo al 100% lo que estoy haciendo con las matrices de colores, por lo que la forma en que lo hice puede ser menos que óptima. Código pegado a continuación en caso de que alguien más se encuentre con el mismo problema.

Básicamente, la transformación hace que los píxeles transparentes sean negros y los píxeles coloreados blancos. Luego usé MakeTransparent en los píxeles blancos. Debería haber una manera de hacer esto en un solo paso, pero lamentablemente está más allá de mí hoy

Gracias de nuevo Chris. Había estado buscando durante horas para encontrar una técnica que funcionara y no había encontrado nada sobre este tipo de transformación.

<%@ page language="vb" contenttype="image/png" %>

<%@ Import Namespace="System.IO" %>
<%@ import namespace="system.drawing" %>
<%@ import namespace="system.drawing.imaging" %>
<%@ import namespace="system.drawing.drawing2d" %>

<script runat="server">
    Sub Page_Load()
        Dim tmpImage As Bitmap = Bitmap.FromFile(Server.MapPath("test.png"))
        Dim input As Bitmap = New Bitmap(tmpImage.Width, tmpImage.Height, PixelFormat.Format32bppArgb)


        Dim trans As New ColorMatrix(New Single()() _
                       {New Single() {0, 1, 1, 1, 0}, _
                        New Single() {1, 0, 1, 1, 0}, _
                        New Single() {1, 1, 0, 1, 0}, _
                        New Single() {1, 1, 1, 1, 0}, _
                        New Single() {0, 0, 0,255, 1}})


        Dim attr As New ImageAttributes
        Dim rc As New Rectangle(0, 0, input.Width, input.Height)
        Dim out As New memorystream
        Dim g As Graphics = Graphics.FromImage(input)
        g.Clear(Color.Transparent)

        attr.SetColorMatrix(trans, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap)      
        g.DrawImage(tmpImage, rc, 0, 0, input.Width, input.Height, GraphicsUnit.Pixel, attr)
        input.makeTransparent(System.Drawing.Color.White)
        input.Save(out, ImageFormat.Png)
        g.Dispose()
        input.Dispose()
        tmpImage.Dispose()
        out.WriteTo(Response.OutputStream)
    End Sub

</script>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top