2010-03-17 46 views
0

下面的方法採用一個顏色矩陣並將其應用於提供的圖像。有幾件事要注意:(1)它不是一個函數
(2)同一個圖像用於創建圖形對象,並作爲DrawImage方法的源代碼。將.Net中的圖像應用於ColorMatrix時的奇怪行爲,WinForms

Public Sub ApplyMatrixToImage(ByVal matrix As ColorMatrix, ByVal image As Image) 
    Using atts As New ImageAttributes 
     atts.SetColorMatrix(matrix) 
     Using g As Graphics = Graphics.FromImage(image) 
      Dim width As Integer = image.Width 
      Dim height As Integer = image.Height 
      Dim rect As New Rectangle(0, 0, width, height) 
      g.DrawImage(image, rect, 0, 0, width, height, GraphicsUnit.Pixel, atts) 
     End Using 
    End Using 
End Sub 

我不知道這是否是不好的做法不是爲了創造另一個位圖來呈現最終圖像之中,但奇怪的是該方法的色彩平衡調整(Matrix30,31和32)正常工作,但對於不透明度調整(Matrix33)沒有任何作用。

發生了什麼事?

+0

@nobugz:請您詳細說明一下 - 我正在做一個應用程序,我有生產 - 而我沒有發現任何問題。你是否說我未來會遇到一個令人討厭的驚喜? – 2010-03-18 09:32:49

+0

我已經看到,當你畫一個位圖到它自己時,它是錯誤的。我忘記了確切的細節,但應該足以添加幾行代碼。 – 2010-03-18 12:11:04

+0

@nobugz:感謝您的警告。如果您嘗試同時重新調整比例,可能會出現問題嗎?然後我可以很容易想象奇怪的事情發生。 [在使用大型位圖(數百Mb)時,如果可以省略這些額外的代碼行,這很好,因爲內存不足異常容易發生,因爲位圖要求所有內存都是連續的...] – 2010-03-18 15:42:58

回答

3

如果我正確理解你的問題:你問你爲什麼不能用這種方法改變alpha通道? (爲什麼它應該是一個功能,而不是一個sub subdedes我完全。)

但爲什麼它不工作,因爲你可能期望opactiy /透明度我完全理解。 :-)

.DrawImage方法(與ImageAttributes結合)將每個更改的像素繪製到自身上(因爲寬度和高度相同)。注意它會 - 不是替換。這意味着原始像素值將與混合與新計算的像素值。除此之外,這意味着如果原始像素是完全不透明的,則無法改變。部分透明的顏色在不透明的物體上繪畫仍然會產生不透明的顏色。

+0

啊,謝謝你解釋它。也感謝nobugz的警告。 – Jules 2010-03-19 12:12:13

+0

+1。我不知道,很高興知道! – 2010-06-11 20:57:39