Formato de salida del cuadro de diálogo Selector de color estándar de Mac OS (elija color)

4

Es posible crear un AppleScript que llame al 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 seleccione un poco de 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 del 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? Por defecto, devuelve el valor de color en este formato: (59432, 59441, 59428) , que es un color de 16 bits de alto , Creo.

¿Puedo especificar de alguna manera que deseo obtener un RGB "estándar" (con 255 como valor máximo)? ¿O cualquier otro? ¿O el color alto de 16 bits es el único formato de salida compatible para choose color ? Eso sería una pena, porque hasta donde sé, no hay manera de obtener valores RGB / Hex adecuados desde un color de 16 bits, ya que implicaría un redondeo y una aproximación.

Quiero decir, el mismo cuadro de diálogo estándar del Selector de color al que llama choose color tiene valores RGB (junto con el hexágono) en su segunda pestaña (Control deslizante de color), por lo que es capaz de devolver valores en esos formatos. Pero, ¿están disponibles para obtener en AppleScript?

Actualización1.

Escribíuna blog-post 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 los scripts son realmente capaces de convertir de color de 16 bits de alto a 255-RGB "normal" y luego a HEX, pero debido al hecho de que el cuentagotas genera un valor incorrecto (de un espacio de color diferente, al parecer), todos los cálculos posteriores están condenados.

    
pregunta retif 14.11.2017 - 11:55

3 respuestas

1

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
    
respondido por el Jon 03.04.2018 - 18:13
0

No pude encontrar el método para cambiar la salida del ColorPicker, pero puedes convertir la salida por ti 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 apagados.

    
respondido por el Mateusz Szlosek 14.11.2017 - 16:06
0

Como no se pudo lograr la respuesta de AppleScript, tengo una alternativa.

Si desea una versión independiente del selector de color nativo que tenga fácil acceso para copiar códigos de color, recomendaría instalar Hues 1.0: zachwaugh / huespedes: Selector de color de tonos 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 el soporte para todos tus complementos está ahí [por lo que lo he identificado].

Otra opción sería usar complementos junto con choose color AppleScript o ColorPicker :


Desarrollador Selector de color

Todavía no es una solución de selección de color y copia automática en el portapapeles, pero está bastante cerca si desea mantener el selector de color predeterminado y no quiere usar aplicaciones de terceros como Sip .


Skala Color

Por ejemplo, o incluso el antiguo Selector de color hexagonal por el software de waffle (si aún funciona).

    
respondido por el pattulus 01.02.2018 - 10:40

Lea otras preguntas en las etiquetas