Es posible crear un AppleScript que solicite el cuadro de diálogo Selector de color estándar de Mac OS ( choose color
) y obtenga el valor de salida después de que el usuario elija un color:
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
Por lo tanto, el valor de color seleccionado se copiará en el portapapeles.
Mi pregunta es: ¿puedo controlar la salida de este cuadro de diálogo Selector de color en AppleScript? De forma predeterminada, devuelve el valor del color en este formato: (59432, 59441, 59428)
, que es un color alto de 16 bits , creo.
¿Puedo especificar de alguna manera que quiero obtener un RGB "estándar" (con 255 como valor máximo) en su lugar? ¿O cualquier otro? ¿O el color de alta densidad de 16 bits es el único formato de salida admitido para choose color
? Eso sería una lástima, porque hasta donde yo sé, no hay forma de obtener los valores RGB/Hex correctos de un color de 16 bits de alto, ya que implicaría redondeo y aproximación.
Quiero decir, el mismo cuadro de diálogo Selector de color estándar al que llama choose color
tiene valores RGB (junto con el hexadecimal) en su segunda pestaña (Controles deslizantes de color), por lo que es capaz de devolver valores en esos formatos. Pero, ¿están disponibles para entrar en AppleScript?
Actualización 1.
Escribí una publicación de blog con más detalles sobre el problema.
Actualización 2.
Como Jon señaló en su respuesta, el problema se origina en el cuentagotas, por lo que las secuencias de comandos en realidad pueden convertir de color de 16 bits de alto a 255-RGB "normal" y luego HEX, pero debido al hecho de que el cuentagotas genera un valor incorrecto (aparentemente de un espacio de color diferente), todos los cálculos posteriores están condenados.
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 Cuentagotas. El selector lo mostró como {236, 236, 236} pero cuando lo devolvió a través de AppleScript, fue {59438, 59436, 59437} o algo similar donde los valores RGB no son los mismos (es decir, no es un gris verdadero). Si abre el selector de color e ingresa manualmente 236 para cada uno de los valores RGB (no use la herramienta de cuentagotas) y luego devuelve el color, devolverá el resultado RGB como 3 valores iguales ({60652, 60652, 60652} ) que luego será forzado 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 forma predeterminada, números enteros de 8 bits (0-255) en lugar de punto flotante (0,0-1,0). Cuando selecciona el color de su imagen de ejemplo con la herramienta Cuentagotas y cambia al control deslizante de escala de grises, se mostrará como 91%. Esto es incorrecto. El valor debe ser 92,5%, pero el selector no muestra flotantes, solo números 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 está 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 Aceptar y nuevamente, debería ver los resultados correctos 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 nuevamente, 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 regresar o Aceptar y los valores RGB correctos deberían estar en el portapapeles. Un dolor, sin duda, pero si la precisión es importante para ti, quizás sea el camino a seguir.
Fuera de 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 una secuencia de comandos revisada que buscará si el usuario canceló el selector de color con el código HEX copiado en el portapapeles. Si ambas condiciones son verdaderas, la secuencia de comandos utilizará el código HEX copiado para agregar el código RGB o HEX al portapapeles. Unos pocos pasos extra incómodos (seleccione y copie la cadena HEX, luego cancele el selector de color) pero quizás sea factible 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
No pude encontrar el método para cambiar la salida de ColorPicker, pero puede convertir la salida usted mismo 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
Utiliza el redondeo, por lo que los valores pequeños pueden estar un poco fuera de lugar.
choose color
el formato de salida (lo que aparentemente no es posible).Como no fue posible lograr la respuesta de AppleScript, tengo una alternativa.
Si desea una versión independiente del selector de color nativo que cuente con fácil acceso para copiar códigos de color, le recomendaría instalar Hues 1.0: zachwaugh/hues: Selector de color Hues para Mac
Lo he estado usando durante años y, a pesar de haber comprado todos los demás en el mercado, sigo volviendo a Hues (y Sip) . Se basa en el selector nativo, por lo que hay soporte para todos sus complementos [por eso lo ♡].
Otra opción sería usar complementos junto con choose color
AppleScript o ColorPicker :
Selector de color del desarrollador
Todavía no es una solución de elegir color y copiar automáticamente al portapapeles, pero está bastante cerca si desea seguir con el selector de color predeterminado y no quiere usar aplicaciones de terceros como Sip .
Por ejemplo, o incluso el antiguo Hex Color Picker del software waffle (si aún funciona).
Retiro
Jon
Retiro
Jon
Jon
Retiro
Jon
Retiro
(59432, 59441, 59428)
a mi AppleScript. Ahora, ¿cómo puedo obtener un valor hexadecimal correcto?Jon
Retiro
Jon
Retiro
(236,236,236)
manualmente y hacer clic en Aceptar proporciona el valor HEX correcto (#ECECEC
) con su secuencia de comandos. Lo mismo ocurre con otros scripts que probé antes. Entonces, el problema es, de hecho, con el cuentagotas. Sin embargo, esa es exactamente la funcionalidad que necesitaba, así que aunque ahora entiendo el origen del problema, eso no lo resuelve :) pero gracias por su paciencia, fui muy terco y no leí con atención la explicación que proporcionó en tu respuesta original.Jon
Jon