Formato di output della finestra di dialogo Color Picker standard di Mac OS (selezionare il colore)

4

È possibile creare un AppleScript che richiede la finestra di dialogo Selettore colore standard Mac OS ( choose color ) e ottiene il valore di output dopo che l'utente ha selezionato un colore:

set the rez to choose color
set the rezStr to rez2string(rez)
set the clipboard to rezStr

on rez2string({r, g, b})
    return "(" & r & ", " & g & ", " & b & ")" as string
end rez2string

Quindi, il valore del colore selezionato verrà copiato negli appunti.

La mia domanda è: posso controllare l'output di questa finestra di dialogo Color Picker in AppleScript? Di default restituisce il valore del colore in questo formato: (59432, 59441, 59428) , che è un colore alto a 16 bit , Credo.

Posso specificare in qualche modo che voglio ottenere un RGB "standard" (con 255 come valore massimo)? O qualsiasi altro? Oppure il colore a 16 bit è l'unico formato di output supportato per choose color ? Sarebbe un peccato, perché, per quanto ne so, non c'è modo di ottenere valori RGB / Hex corretti da colori alti a 16 bit poiché implicherebbero arrotondamenti e approssimazioni.

Voglio dire, la stessa finestra di dialogo Color Picker standard chiamata da choose color ha valori RGB (insieme a quello Hex) nella sua seconda scheda (Color Sliders), quindi è in grado di restituire valori in quei formati. Ma sono disponibili per entrare in AppleScript?

Aggiornamento1.

Hoscrittoun post sul blog con altro dettagli sul problema.

Aggiornamento 2.

Come Jon ha sottolineato nella sua risposta, il problema ha origine nel contagocce, quindi gli script sono effettivamente in grado di convertire da 16-bit high color in "normale" 255-RGB e poi HEX, ma a causa del fatto che eye-dropper emette un valore errato (da uno spazio cromatico diverso, apparentemente), tutti gli altri calcoli sono condannati.

    
posta retif 14.11.2017 - 11:55
fonte

3 risposte

1

Innanzitutto, questo è lo script che utilizzo:

set format to (button returned of (display dialog "Select the format of the chosen color for the clipboard." buttons {"Cancel", "HEX", "RGB"} default button 3 with icon 1 with title "Color Picker"))
set {r, g, b} to choose color
set {r, g, b} to {_16_to_8(r), _16_to_8(g), _16_to_8(b)}
if (format = "RGB") then
    set the clipboard to ("rgb(" & r & ", " & g & ", " & b & ")")
else
    set the clipboard to ("#" & {dec_to_hex(r), dec_to_hex(g), dec_to_hex(b)})
end if

on _16_to_8(n)
    return ((n / 65535) * 255) as integer
end _16_to_8

property hex_chars : "0123456789ABCDEF"'s characters
on dec_to_hex(n)
    if (n = 0) then return "00"
    return (hex_chars's item (((n div 16) mod 16) + 1)) & (hex_chars's item ((n mod 16) + 1))
end dec_to_hex

Il problema che stai vedendo è specifico del colore che hai scelto ({236, 236, 236} / ECECEC) usando lo strumento contagocce. Il selettore lo mostra come {236, 236, 236} ma quando viene restituito tramite AppleScript, era {59438, 59436, 59437} o qualcosa di simile in cui i valori RGB non sono gli stessi (cioè non un vero grigio). Se apri il selettore dei colori e inserisci manualmente 236 per ciascuno dei valori RGB (non utilizzare lo strumento contagocce) e quindi restituisci il colore, restituirà il risultato RGB come 3 valori uguali ( {60652, 60652, 60652}) che verranno quindi convertiti correttamente dallo script sopra.

Credo ci sia un problema di arrotondamento con il selettore di colori e lo strumento eye-dropper poiché mostra, per impostazione predefinita, numeri interi a 8 bit (0-255) invece di virgola mobile (0.0-1.0). Quando raccogli il colore dall'immagine di esempio con lo strumento contagocce e passa al cursore della scala di grigi, verrà visualizzato come 91%. Questo non è corretto Il valore deve essere 92,5% ma il selettore non mostra i float, solo i numeri interi nel dispositivo di scorrimento della scala di grigi (puoi passare ai float nella sezione del cursore RGB dal pulsante di azione a destra del pulsante a comparsa del tipo di cursore). Se ti trovi nella sezione del dispositivo di scorrimento della scala di grigi, inserisci manualmente 92.5 e poi premi il tasto Tab per ottenere il valore accettato dal selettore, quindi premi il pulsante OK e di nuovo, dovresti vedere i risultati corretti in AppleScript.

Quindi, se il risultato di AppleScript non è quello che stai vedendo nel selettore, copia il valore HEX dal campo HEX del selettore e annulla il selettore premendo Esc o il pulsante Annulla. Se vuoi i colori RGB, esegui di nuovo lo script ma invece di usare lo strumento eye-dropper, incolla il valore HEX nel campo Hex e premi tab per confermare la voce e poi premi return o OK e i valori RGB appropriati dovrebbero essere sul clipboard. Un dolore, senza dubbio, ma se la precisione è importante per te, forse la strada da percorrere.

Off topic ma usando il codice sopra, puoi anche convertire ASCII in HEX:

string_to_hex("Convert to hexadecimal!")

property hex_chars : "0123456789ABCDEF"'s characters
on dec_to_hex(n)
    if (n = 0) then return "00"
    return (hex_chars's item (((n div 16) mod 16) + 1)) & (hex_chars's item ((n mod 16) + 1))
end dec_to_hex

on string_to_hex(s)
    set r to {}
    repeat with c in s's characters
        set end of r to dec_to_hex(ASCII number c)
    end repeat
    return r as string
end string_to_hex

Aggiorna

Ecco uno script revisionato che cercherà di vedere se l'utente ha annullato il selettore di colori con il codice HEX copiato negli Appunti. Se entrambe queste condizioni sono vere, lo script utilizzerà il codice HEX copiato per aggiungere negli appunti il codice RGB o HEX. Un paio di passaggi imbarazzanti in più (seleziona e copia la stringa HEX, quindi annulla il selettore di colori) ma forse fattibile per le tue esigenze.

try
    set format to (button returned of (display dialog "Select the format of the chosen color for the clipboard." buttons {"Cancel", "HEX", "RGB"} default button 3 with icon 1 with title "Color Picker"))
    set {r, g, b} to choose color
    set {r, g, b} to {_16_to_8(r), _16_to_8(g), _16_to_8(b)}
on error e number n
    if (n = -128) then --user canceled
        set clipboard_string to (get the clipboard)
        if ((clipboard_string count) = 6) then
            set {r, g, b} to hex_string_to_dec(clipboard_string)
        else
            return
        end if
    else
        log {n:n, e:e}
        return
    end if
end try
if (format = "RGB") then
    set the clipboard to ("rgb(" & r & ", " & g & ", " & b & ")")
else
    set the clipboard to ("#" & {dec_to_hex(r), dec_to_hex(g), dec_to_hex(b)})
end if

on _16_to_8(n)
    return ((n / 65535) * 255) as integer
end _16_to_8

property hex_chars : "0123456789ABCDEF"'s characters
on dec_to_hex(n)
    if (n = 0) then return "00"
    return (hex_chars's item (((n div 16) mod 16) + 1)) & (hex_chars's item ((n mod 16) + 1))
end dec_to_hex

property hex_to_dec_chars : "0.1.2.3.4.5.6.7.8.9AaBbCcDdEeFf"
on hex_to_dec(s)
    set s to s's items's reverse
    set {d, p} to {0, 0}
    repeat with c in s
        set d to d + (((offset of c in hex_to_dec_chars) div 2) * (16 ^ p))
        set p to p + 1
    end repeat
    return d as integer
end hex_to_dec

on hex_string_to_dec(s)
    if character 1 of s = "#" then set s to s's text 2 thru -1
    set r to {}
    repeat with x from 1 to length of s by 2
        set end of r to hex_to_dec(s's text x thru (x + 1))
    end repeat
    return r
end hex_string_to_dec
    
risposta data 03.04.2018 - 18:13
fonte
0

Non sono riuscito a trovare il metodo per modificare l'output di ColorPicker, ma puoi convertire l'output da solo con:

set the rez to choose color
set the rezStr to rez2string(rez)
set the clipboard to rezStr

on rez2string({r, g, b})
    return "(" & to8bit(r) & ", " & to8bit(g) & ", " & to8bit(b) & ")" as string
end rez2string

on to8bit(x)
    return (round (x / 256) rounding down) as integer
end to8bit

Utilizza l'arrotondamento, quindi i valori piccoli possono essere un po 'spenti.

    
risposta data 14.11.2017 - 16:06
fonte
0

Poiché non è stato possibile raggiungere la risposta AppleScript, ho un'alternativa.

Se vuoi una versione standalone del selettore di colori nativo che offre un facile accesso alla copia dei codici colore, ti consiglio di installare Hues 1.0: zachwaugh / hues: Selezione colori per Mac

L'ho usato per anni e nonostante abbia comprato tutti gli altri sul mercato, continuo a tornare a Hues (e Sip) . È basato sul selettore nativo, quindi il supporto per tutti i componenti aggiuntivi è lì [che è il motivo per cui I ♡ it].

Un'altra opzione potrebbe utilizzare i plugin insieme a choose color AppleScript o ColorPicker :

> Sviluppatore Selettore colore

Non è ancora una soluzione pick-color-and-automatically-copy-to-clipboard, ma è piuttosto stretta se si vuole mantenere il selettore di colori predefinito e non si vuole usare app di terze parti come Sorso .


Skala Colore

Per esempio o anche il vecchio Hex Color Picker dal software waffle (se funziona ancora).

    
risposta data 01.02.2018 - 10:40
fonte

Leggi altre domande sui tag