2011-03-25 145 views
1

我更像是一個PHP編碼器,然後是VB.net程序員,所以我做了這個,想知道是否有人可以幫助我轉換這個函數。將函數從PHP轉換爲VB.NET時遇到困難

<?php 
function grabshade($r,$g,$b){ 
$colors = array(array(0, 0, 0), array(255, 255, 255)); 
$differencearray = array(); 
$colors2 = array(
'black' => array(0, 0, 0), 
'white' => array(255, 255, 255)); 

foreach ($colors as $col2) { 
$delta_r = $r - $col2[0]; 
$delta_g = $g - $col2[1]; 
$delta_b = $b - $col2[2]; 
$distance = $delta_r * $delta_r + $delta_g * $delta_g + $delta_b * $delta_b; 
array_push($differencearray, $distance); 
} 
$smallest = min($differencearray); 
$key = array_search($smallest, $differencearray); 
return $key = array_search($colors[$key], $colors2); 
} 
?> 

如果PHP腳本接近白色或黑色,它將獲取r,g,b值並返回。

這應該是工作,但它不返回任何東西。

Public Function findshade(ByVal r, ByVal g, ByVal b) As Integer 
Dim colors As New ArrayList() 
colors.Add("0:0:0") 
colors.Add("255:255:255") 
Dim differencearray As New ArrayList() 

Dim colors2 As New ArrayList() 
colors2.Add("0:0:0") 
colors2.Add("255:255:255") 
Dim i As Integer 
For i = 0 To colors.Count - 1 Step i + 1 
    Dim colorsparts As String() = colors(i).Split(":") 
    Dim delta_r As Integer = r - colorsparts(0) 
    Dim delta_g As Integer = g - colorsparts(1) 
    Dim delta_b As Integer = b - colorsparts(2) 
    Dim distance As Integer = delta_r * delta_r + delta_g * delta_g + delta_b * delta_b 
    differencearray.Add(distance) 
Next 
differencearray.Sort() 
Dim minValue As Integer = Convert.ToInt32(differencearray(0)) 

Dim result As New ArrayList() 
For ii As Integer = 0 To differencearray.Count 
    If differencearray(ii).Contains(minValue) Then result.Add(i) 
Next 
Dim key As Integer = result(0) 
Dim result2 As New ArrayList() 
For ii As Integer = 0 To colors2.Count 
    If colors2(ii).Contains(key) Then result2.Add(i) 
Next 

Return result2(0) 
End Function 
+1

到目前爲止取得了哪些進展?你遇到了什麼絆腳石?沒有什麼特別的PHP在這裏不會將*立即*轉換成任何*其他語言...好吧,也許'array_search'可能需要一些跳躍。 – Charles 2011-03-25 05:50:51

+0

我不太瞭解VB.net,就像我不知道如何爲那個任務形成數組(比如能夠編輯鍵名),或者像你說的array_search。 – Ugleh 2011-03-25 05:59:59

+0

@Joseph,感謝您的更新。我更新了這篇文章的標題,使其更有用,並希望吸引有用的關注。我自己並不知道任何VB,所以我不會太多幫助。 ''array_search'將成爲唯一的問題,我想。值得慶幸的是,它可以作爲對數組的簡單迭代實現,當它找到值時結束。當然,這實際上意味着使用真正的數組而不是分割字符串...... – Charles 2011-03-25 06:28:21

回答

0

我採取了獨立的方法,我製作的php代碼意味着多於兩種顏色,它的意思是(最初)20.它用於確定您輸入的最接近顏色的顏色數組,但自從現在我只做黑白兩色,最近我簡化了一切。

Public Function findshade(ByVal r, ByVal g, ByVal b) As Integer 
     Dim delta_r As Integer = r - 255 
     Dim delta_g As Integer = g - 255 
     Dim delta_b As Integer = b - 255 
     Dim distance As Integer = delta_r * delta_r + delta_g * delta_g + delta_b * delta_b 


     Return distance 
    End Function 
    Public Function findshade2(ByVal r, ByVal g, ByVal b) As Integer 
     Dim delta_r As Integer = r - 0 
     Dim delta_g As Integer = g - 0 
     Dim delta_b As Integer = b - 0 
     Dim distance As Integer = delta_r * delta_r + delta_g * delta_g + delta_b * delta_b 


     Return distance 
    End Function 

功能findshade會找到你的記錄是如何接近白色,和findshade2會找到你的記錄是如何接近黑色。

要確定像素是否應該是黑色或白色,您將得到兩個entrys並找到從那裏不難得到的最小值。

TextBox1.Text = findshade(255, 255, 255).ToString 
TextBox2.Text = findshade2(255, 255, 255).ToString 
0

我剛剛在VB.NET中寫了一個快速函數。希望它可以幫助你。

''' <summary> 
''' Find the array index of the value if found in the String array. Else returns -1 
''' </summary> 
''' <param name="StringArray"></param> 
''' <param name="Value"></param> 
''' <returns></returns> 
''' <remarks></remarks> 
Function ArraySearch(ByVal StringArray As String(), ByVal Value As String) As Integer 
    Dim i As Integer 
    For i = 0 To StringArray.Length 
     If StringArray(i) = Value Then 
      Return i 
     End If 
    Next 
    Return -1 
End Function 

PHP array_search可以在VB.NET

How can I search an array in VB.NET?

+0

這不是真正的完整問題,但我已經看過那篇文章,現在即時添加它。我不明白它在哪裏得到我。 – Ugleh 2011-03-25 06:45:27

+0

檢查我的答案。更新。 – emaillenin 2011-03-25 06:49:50

0

實現對於更通用的方法,你可以使用Phalanger編譯PHP代碼爲CLR,然後用Reflector把它翻譯成VB.Net代碼。

我在想,如果你有大量的代碼翻譯。輸出的代碼對於人眼來說並不完美,但是可以執行。