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