Primero, este es el script que uso:
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
El problema que está viendo es específico del color que eligió ({236, 236, 236} / ECECEC) usando la herramienta de gotero. El selector lo mostró como {236, 236, 236} pero cuando se devolvió a través de AppleScript, fue {59438, 59436, 59437} o algo parecido donde los valores RGB no son los mismos (es decir, no es un gris verdadero). Si abre el selector de color e ingresa 236 manualmente para cada uno de los valores RGB (no use la herramienta de gotas para los ojos) y luego devuelve el color, devolverá el resultado RGB como 3 valores iguales ( {60652, 60652, 60652}) que luego serán coaccionados correctamente por el script anterior.
Creo que hay un problema de redondeo con el selector de color y la herramienta cuentagotas, ya que muestra, de manera predeterminada, enteros de 8 bits (0-255) en lugar de punto flotante (0.0-1.0). Cuando recoja el color de la imagen de ejemplo con la herramienta cuentagotas y cambie al control deslizante de escala de grises, se mostrará como 91%. Esto es incorrecto. El valor debería ser del 92,5%, pero el selector no muestra flotantes, solo enteros en el control deslizante de escala de grises (puede cambiar a flotantes en la sección del control deslizante RGB desde el botón de acción a la derecha del botón emergente de tipo de control deslizante). Si se encuentra en la sección del control deslizante de escala de grises, ingrese manualmente 92.5 y luego presione la tecla de tabulación para que el selector acepte el valor, luego presione el botón OK y nuevamente, debería ver los resultados adecuados en AppleScript.
Entonces, si el resultado de AppleScript no es lo que está viendo en el selector, simplemente copie el valor HEX del campo HEX del selector y cancele el selector presionando esc o el botón Cancelar. Si desea los colores RGB, ejecute el script otra vez, pero en lugar de usar la herramienta cuentagotas, pegue el valor HEX en el campo Hex y presione la pestaña para confirmar la entrada, luego presione la tecla Intro o Aceptar y los valores RGB correctos deben estar en la casilla. portapapeles. Un dolor, sin duda, pero si la precisión es importante para usted, tal vez el camino a seguir.
Fuera del tema pero utilizando el código anterior, también puede convertir ASCII a 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
ACTUALIZAR
Aquí hay un script revisado que verá si el usuario canceló el selector de color con el código HEX copiado en el portapapeles. Si ambas condiciones son verdaderas, entonces la secuencia de comandos usará el código HEX copiado para agregar el código RGB o HEX al portapapeles. Unos pocos pasos extra (seleccione y copie la cadena HEX, luego cancele el selector de color) pero quizás sea posible para sus necesidades.
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