2013-05-13 16 views
5

In VBA, come posso leggere il valore del colore di ciascun pixel di un'immagine?Leggi i colori dei pixel di un'immagine

Ho trovato this solution in VB 6.0 ma non si applica direttamente in VBA.

+1

se il codice utilizza l'API, è piuttosto possibile implementarlo in VBA impostando alcuni riferimenti alle funzioni dell'API ... –

+0

Di quale tipo di file stai chiedendo? Qualcuno in particolare? Forse un elenco di tipi di file? Diversi formati di file memorizzeranno le informazioni sui colori in modo diverso, quindi leggere diversi tipi richiederà sapere cosa ci sarà richiesto di leggere. – jhoe

+0

La risposta qui sotto funziona alla grande ma se in realtà vuoi scansionare ogni pixel (piuttosto che cliccarci sopra) allora questo https://stackoverflow.com/questions/45998565/scan-image-pixel-by-pixel-in-vba/ 46004570 # 46004570 funziona bene e tutto in VBA (senza librerie grafiche, ecc.) – perfo

risposta

6

provare la soluzione pubblicate su questo sito qui: http://sim0n.wordpress.com/2009/03/27/vba-q-how-to-get-pixel-colour/

ho dovuto cambiare un ByRef a un ByVal ma a parte questo funziona bene. Inserisci un'immagine utilizzando Inserisci> Immagine e assegna una macro all'evento su clic. L'ho appena impostato impostando il colore della cella A1 sul colore su cui fai clic, ma sono certo che l'idea ti verrà in mente.

#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 

Per utilizzarlo, posizionare un'immagine in un foglio di lavoro, fare clic con il pulsante destro sull'immagine e assegnarvi questa macro.

+0

Ottima risposta, testato e funziona perfettamente. +1 – hammythepig

+1

Lo stesso qui, con informazioni aggiuntive: puoi anche usare immagini che semplicemente incollate nel foglio (la procedura "Inserisci> Immagine" non è obbligatoria). Grazie ancora +1 e grazie @KM Hs – Arthur

Problemi correlati