2013-01-07 51 views
1

我正在努力解決以下問題:我用紅色繪製了一張小圖片。此顏色必須更改爲其他顏色(用戶選擇)。我用MSDN和一些谷歌上搜索做了以下內容:Vb.net改變圖片的顏色

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」部分 - 這與另一個用例有關。

的問候和誠摯的感謝 基督教紹爾

回答

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) 

由於圖形gtempBmp(這是的DrawImage操作之前是空的)繪製mypict將吸引到它與參數相關聯的對象。

另一個建議是,您刪除g.Save()行。當您計劃稍後恢復時保存圖形對象。做一個Graphics.Save()不會保存圖片。真正保存您所做更改的是tempBmp.Save()系列。

+0

謝謝,這個伎倆! 我仍然困惑爲什麼你需要tempbmp - 我會猜到你可以從mypict創建g然後繪製它... –

+0

當你從位圖創建一個'Graphics'時,你對該對象所做的任何事情都被繪製到您從中創建'Graphics'對象的位圖。所以如果你想繪製到'tempBmp',請執行'Graphics.FromImage(tempBmp)';如果你想繪製「mypict」,請執行'Graphics.FromImage(mypict)'。任何使用'g'繪製的東西都會顯示在您創建圖形對象的圖像上。 –

+0

啊,非常感謝! –