2013-05-13 129 views
5

在VBA中,如何讀取圖像中每個像素的顏色值?讀取圖像的像素顏色

我在VB 6.0中發現this solution,但它並不直接適用於VBA。

+1

如果代碼使用API​​,那麼它很可能實現它到VBA中,設置API函數的一些引用... – 2013-05-13 19:08:37

+0

你問什麼文件類型?任何特別的?也許是一個文件類型的列表?不同的文件格式將存儲不同的顏色信息,因此讀取不同的類型將需要知道我們將需要閱讀什麼。 – jhoe 2013-06-03 22:13:18

+0

下面的答案很好,但如果你真的想掃描每個像素(而不是點擊它),那麼這個https://stackoverflow.com/questions/45998565/scan-image-pixel-by-pixel-in-vba/ 46004570#46004570很好地完成了這項工作,所有在VBA(沒有圖形庫等) – perfo 2017-09-06 08:27:47

回答

6

嘗試在網站上公佈這裏的解決方案: http://sim0n.wordpress.com/2009/03/27/vba-q-how-to-get-pixel-colour/

我不得不改變的ByRef到BYVAL但,除了它工作得很好。使用「插入」>「圖片」插入圖片,併爲點擊事件分配一個宏。我剛剛將單元格A1的顏色設置爲您點擊的顏色,但我相信您明白了。

#If VBA7 Then 
    Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long) As Long 
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef lpPoint As POINT) As LongPtr 
    Private Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr 
#Else 
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long,  ByVal y As Long) As Long 
    Private Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINT) As Long 
    Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long 
#End If 
Private Type POINT 
    x As Long 
    y As Long 
End Type 

Sub Picture1_Click() 
    Dim pLocation As POINT 
    Dim lColour As Long 

    Dim lDC As Variant 
    lDC = GetWindowDC(0) 
    Call GetCursorPos(pLocation) 
    lColour = GetPixel(lDC, pLocation.x, pLocation.y) 
    Range("a1").Interior.Color = lColour 
End Sub 

要使用它,將圖片放置在工作表中,右鍵單擊圖像並將其分配給它。

+0

偉大的答案,測試它,它完美的作品。 +1 – hammythepig 2013-06-20 20:09:49

+1

此處還有其他信息:您還可以使用只需粘貼在工作表中的圖像(「插入>圖片」過程不是強制性的)。再次感謝+1並感謝您@KM Hs – Arthur 2014-04-24 15:02:31