1

我正在努力解决以下问题:我有一张小图片被涂成红色。此颜色必须更改为另一种颜色(用户选择)。我使用了 msdn,一些谷歌搜索做了以下事情:

    Private Function GetPicture(Iterator As Integer, tempfile As String) As String
        Dim Rstring = ""

        If Colors.Count = 0 OrElse Iterator >= Colors.Count Then
            Rstring = tempfile
        Else
            Dim NewPicture = My.Computer.FileSystem.GetTempFileName()
            My.Computer.FileSystem.CopyFile(tempfile, NewPicture, True)
            Dim mypict = New Bitmap(NewPicture)

            Dim ColorList As New List(Of Color)

            For x = 0 To mypict.Width - 1
                For y = 0 To mypict.Height - 1
                    Dim mypixel = mypict.GetPixel(x, y)

                    If ColorList.Contains(mypixel) = False Then
                        ColorList.Add(mypixel)
                    End If
                Next
            Next

            Dim NewColor = Color.FromArgb(255, 0, 0, 255)
            Dim ListOfColorMaps As New List(Of ColorMap)
            For Each elem In ColorList
                Dim newcolormap = New ColorMap
                newcolormap.OldColor = elem
                newcolormap.NewColor = NewColor
                ListOfColorMaps.Add(newcolormap)
            Next

            Dim imageAttributes As New ImageAttributes()
            Dim width As Integer = mypict.Width
            Dim height As Integer = mypict.Height
            Dim colorMap As New ColorMap()


            'colorMap.OldColor = Color.FromArgb(255, 0, 0, 0) ' opaque red
            'colorMap.NewColor = Color.FromArgb(255, 0, 0, 255) ' opaque blue
            Dim remapTable As ColorMap() = ListOfColorMaps.ToArray
            imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap)

            Dim tempBmp = New Bitmap(width, height)
            Dim g = Graphics.FromImage(tempBmp)
            g.DrawImage(tempBmp, New Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel, imageAttributes)

            g.Save()
            g.Dispose()
            mypict.Dispose()

            Dim NewFileName = NewPicture.Remove(NewPicture.IndexOf("."c) - 1) & ".png"
            tempBmp.Save(NewFileName, Imaging.ImageFormat.Png)

            My.Computer.FileSystem.DeleteFile(NewPicture)

            tempBmp.Dispose()
            Rstring = NewPicture
        End If


        Return Rstring

代码无异常运行,似乎找到了所需的颜色,但保存的 tempbmp 不包含图片。发生这种情况是因为代码在没有图形的 dll 中运行吗?

您几乎可以忽略“IF”部分——这与另一个用例有关。

问候和真诚的感谢 Christian Sauer

4

1 回答 1

1

您没有显示任何图片,因为您正在绘制一个空位图。

您的问题从这里开始:

Dim tempBmp = New Bitmap(width, height)
Dim g = Graphics.FromImage(tempBmp)
g.DrawImage(tempBmp, New Rectangle(0, 0, width, height), 0, 0, width, height, _
            GraphicsUnit.Pixel, imageAttributes)
  • 您创建一个新位图(可能具有白色背景)。
  • Graphics然后从空位图创建一个新对象。
  • 然后将空位图绘制到自身上。

您应该做的是绘制mypict对象(这是您要更改其颜色的位图)。因此,您的第三行应如下所示:

g.DrawImage(mypict, New Rectangle(0, 0, width, height), 0, 0, width, height, _
            GraphicsUnit.Pixel, imageAttributes)

由于 Graphics 对象g关联tempBmp(在 DrawImage 操作之前为空),因此绘图mypict将使用您的参数绘制到它。

另一项建议是删除该g.Save()行。当您计划稍后恢复图形对象时,您可以保存它。执行 aGraphics.Save()不会保存图片。真正保存您所做更改的是该tempBmp.Save()行。

于 2013-01-08T10:55:07.540 回答