Инвертирование прозрачности изображения в ASP.net
-
03-07-2019 - |
Вопрос
Я пытаюсь создать страницу, которая позволит мне взять входное изображение и создать из него маску.Входными данными будет индексированный PNG с прозрачным фоном.Результирующее изображение будет черным там, где исходное изображение было прозрачным, и прозрачным там, где исходное изображение было непрозрачным.
Я проделал некоторые базовые манипуляции с изображениями в asp.net, но не знаю, как действовать.Я надеюсь, что есть какое-то решение быстрее, чем идти попиксельно.
Если кто-нибудь может указать мне правильное направление, я был бы очень признателен.
Решение
Вероятно, вам следует изучить трансформации.
http://en.csharp-online.net/GDIplus_Graphics_Transformation%E2%80%94Image_Transformation
Другие советы
Хорошо, у меня есть рабочее решение с использованием преобразований.Честно говоря, я не на 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>