我正在尝试构建一个允许我拍摄输入图像并从中生成遮罩的页面。输入将是具有透明背景的索引PNG。得到的图像将是黑色的,其中原始图像是透明的并且在原始图像不透明的任何地方都是透明的。
我在asp.net中做了一些非常基本的图像处理,但我不确定如何继续。我希望有一些解决方案比逐像素更快。
如果有人能指出我正确的方向,我会非常感激。
答案 0 :(得分:1)
答案 1 :(得分:0)
好的我有一个使用转换的工作解决方案。说实话,我并不是100%理解我在使用颜色矩阵做什么 - 所以我这样做的方式可能不够理想。代码粘贴在下面,以防其他人遇到同样的问题。
基本上,变换使透明像素变为黑色,彩色像素变为白色。然后我在白色像素上使用了MakeTransparent。应该有一种方法可以在一个步骤中完成这项工作但不幸的是,今天它已超出我的范围
再次感谢克里斯 - 我一直在寻找一种能够发挥作用的技术,而且我没有遇到任何关于这种转变的事情。
<%@ 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>