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」の部分はほとんど無視できます。これは、別のユースケースと関係があります。

挨拶と心からの感謝クリスチャンザウアー

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オブジェクトを描画することです(これは、色を変更したいビットマップです)。したがって、3 行目は次のようになります。

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

Graphics オブジェクトは(DrawImage 操作の前は空である) にg関連付けられているため、描画はパラメーターを使用して描画されます。tempBmpmypict

もう 1 つの推奨事項は、行を削除することですg.Save()。後で復元する予定がある場合は、グラフィックス オブジェクトを保存します。をGraphics.Save()実行しても画像は保存されません。行った変更を実際に保存するのはtempBmp.Save()行です。

于 2013-01-08T10:55:07.540 に答える