Es ist möglich, ein AppleScript zu erstellen, das das standardmäßige Farbauswahldialogfeld von Mac OS ( choose color
) aufruft und den Ausgabewert erhält, nachdem der Benutzer eine Farbe ausgewählt hat:
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
Der ausgewählte Farbwert wird also in die Zwischenablage kopiert.
Meine Frage ist: Kann ich die Ausgabe dieses Farbauswahldialogs in AppleScript steuern? Standardmäßig gibt es den Farbwert in diesem Format zurück: (59432, 59441, 59428)
, was eine 16-Bit-High-Color ist , glaube ich.
Kann ich irgendwie angeben, dass ich stattdessen ein "Standard"-RGB (mit 255 als Maximalwert) erhalten möchte? Oder irgend ein anderer? Oder ist 16-Bit High Color das einzige unterstützte Ausgabeformat für choose color
? Das wäre schade, denn meines Wissens gibt es keine Möglichkeit, korrekte RGB/Hex-Werte aus 16-Bit-High-Color zu erhalten, da dies Rundung und Annäherung erfordern würde.
Ich meine, derselbe standardmäßige Color Picker-Dialog, der aufgerufen wird, choose color
hat RGB-Werte (zusammen mit dem Hex-Wert) auf seiner zweiten Registerkarte (Color Sliders), sodass er in der Lage ist, Werte in diesen Formaten zurückzugeben. Aber sind diese in AppleScript verfügbar?
Aktualisierung 1.
Ich habe einen Blog-Beitrag mit mehr Details über das Problem geschrieben.
Aktualisierung 2.
Wie Jon in seiner Antwort betonte, liegt das Problem an der Pipette, sodass Skripte tatsächlich in der Lage sind, 16-Bit-High-Color in "normales" 255-RGB und dann HEX umzuwandeln, aber aufgrund der Tatsache, dass die Pipette einen falschen Wert ausgibt (anscheinend aus einem anderen Farbraum), sind alle weiteren Berechnungen zum Scheitern verurteilt.
Zuerst ist dies das Skript, das ich verwende:
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
Das Problem, das Sie sehen, ist spezifisch für die Farbe, die Sie mit der Pipette ausgewählt haben ({236, 236, 236} / ECECEC). Der Picker zeigte es als {236, 236, 236}, aber als es über AppleScript zurückgegeben wurde, war es {59438, 59436, 59437} oder etwas in der Nähe, wo die RGB-Werte nicht gleich sind (dh kein echtes Grau). Wenn Sie die Farbauswahl öffnen und manuell 236 für jeden der RGB-Werte eingeben (verwenden Sie nicht das Pipettenwerkzeug) und dann die Farbe zurückgeben, wird das RGB-Ergebnis als 3 gleiche Werte zurückgegeben ({60652, 60652, 60652} ), die dann vom obigen Skript ordnungsgemäß erzwungen werden.
Ich glaube, es gibt ein Rundungsproblem mit dem Farbwähler und dem Pipettenwerkzeug, da es standardmäßig 8-Bit-Ganzzahlen (0-255) anstelle von Gleitkommazahlen (0,0-1,0) anzeigt. Wenn Sie die Farbe aus Ihrem Beispielbild mit der Pipette aufnehmen und zum Graustufen-Schieberegler wechseln, wird sie als 91 % angezeigt. Das ist falsch. Der Wert sollte 92,5 % betragen, aber die Auswahl zeigt keine Gleitkommazahlen, sondern nur ganze Zahlen im Graustufen-Schieberegler (Sie können im Abschnitt RGB-Schieberegler über die Aktionsschaltfläche rechts neben der Popup-Schaltfläche für den Schiebereglertyp zu Gleitkommazahlen wechseln). Wenn Sie sich im Graustufen-Schiebereglerbereich befinden, geben Sie manuell 92,5 ein und drücken Sie dann die Tabulatortaste, damit der Wert von der Auswahl akzeptiert wird. Drücken Sie dann die Schaltfläche OK, und erneut sollten Sie die richtigen Ergebnisse in AppleScript sehen.
Wenn also das Ergebnis von AppleScript nicht das ist, was Sie in der Auswahl sehen, kopieren Sie einfach den HEX-Wert aus dem HEX-Feld der Auswahl und brechen Sie die Auswahl ab, indem Sie esc oder die Schaltfläche Abbrechen drücken. Wenn Sie die RGB-Farben möchten, führen Sie das Skript erneut aus, aber anstatt das Pipettenwerkzeug zu verwenden, fügen Sie den HEX-Wert in das Hex-Feld ein und drücken Sie die Tabulatortaste, um den Eintrag zu bestätigen, und drücken Sie dann die Eingabetaste oder OK, und die richtigen RGB-Werte sollten auf dem sein Zwischenablage. Zweifellos ein Schmerz, aber wenn Ihnen Präzision wichtig ist, vielleicht der richtige Weg.
Off-Topic, aber mit dem obigen Code können Sie auch ASCII in HEX konvertieren:
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
AKTUALISIEREN
Hier ist ein überarbeitetes Skript, das prüft, ob der Benutzer die Farbauswahl mit dem in die Zwischenablage kopierten HEX-Code abgebrochen hat. Wenn beide Bedingungen zutreffen, verwendet das Skript den kopierten HEX-Code, um den RGB- oder HEX-Code zur Zwischenablage hinzuzufügen. Ein paar zusätzliche umständliche Schritte (wählen und kopieren Sie die HEX-Zeichenfolge und brechen Sie dann die Farbauswahl ab), aber für Ihre Anforderungen möglicherweise machbar.
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
Ich konnte die Methode zum Ändern der Ausgabe des ColorPickers nicht finden, aber Sie können die Ausgabe selbst konvertieren mit:
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
Es wird gerundet, sodass kleine Werte etwas abweichen können.
choose color
Ausgabeformat zu steuern (was anscheinend nicht möglich ist).Da die AppleScript-Antwort nicht erreicht werden konnte, habe ich eine Alternative.
Wenn Sie eine eigenständige Version des nativen Farbwählers wünschen, die einfachen Zugriff auf das Kopieren von Farbcodes bietet, würde ich die Installation von Hues 1.0 empfehlen: zachwaugh/hues: Hues color picker for Mac
Ich benutze es seit Jahren und obwohl ich alle anderen auf dem Markt gekauft habe, komme ich immer wieder auf Hues (und Sip) zurück . Es basiert auf dem nativen Picker, also gibt es Unterstützung für all deine Add-Ons [weshalb ich es ♡ mache].
Eine weitere Option wäre die Verwendung von Plugins zusammen mit choose color
AppleScript oder ColorPicker :
Es ist immer noch keine Lösung zum Auswählen von Farben und zum automatischen Kopieren in die Zwischenablage, aber es ist ziemlich nah dran, wenn Sie beim Standard-Farbwähler bleiben und keine Apps von Drittanbietern wie Sip verwenden möchten .
Zum Beispiel oder sogar der alte Hex Color Picker von Waffle Software (falls er noch funktioniert).
retif
Jon
retif
Jon
Jon
retif
Jon
retif
(59432, 59441, 59428)
an mein AppleScript zurück. Wie bekomme ich nun einen korrekten HEX-Wert daraus?Jon
retif
Jon
retif
(236,236,236)
manuell einzustellen und auf OK zu klicken, liefert den korrekten HEX-Wert (#ECECEC
) mit Ihrem Skript. Gleiches gilt für andere Skripte, die ich zuvor getestet habe. Das Problem liegt also tatsächlich bei der Pipette. Das ist jedoch genau die Funktionalität, die ich brauchte, also, obwohl ich jetzt die Ursache des Problems verstehe, löst es es nicht :) aber danke für deine Geduld, ich war so stur und habe die Erklärung, die du gegeben hast, nicht sorgfältig gelesen in deiner ursprünglichen Antwort.Jon
Jon