2010-03-16 2 views
8

Ich möchte den Namen einer Farbe aus dem hexadezimalen Farbcode finden. Wenn ich einen hex-Farbcode bekomme, möchte ich den passenden Farbnamen finden. zum Beispiel für den Code # c06040, wie man herausfinden kann, ob es eine Schattierung von Braun, Blau oder Gelb ist? damit ich die Farbe eines Gegenstandes im Bild ohne menschlichen Eingriff finden kann.finden Sie den Farbnamen von einem hexadezimalen Farbcode

Gibt es eine Beziehung zwischen dem Hexadezimalcode der Schattierungen einer Farbe? Bitte geben Sie einen Beispielcode ein, falls vorhanden.

Antwort

7

Es gibt ein Programm mit der Quelle pynche namens Python verteilt ist, die diese

tun können

Die von Ihnen benötigte Funktionalität ist in der Methode ColorDB.nearest() in ColorDB.py

Von Python/Tool/README

Introduction 

    Pynche is a color editor based largely on a similar program that I 
    originally wrote back in 1987 for the Sunview window system. That 
    editor was called ICE, the Interactive Color Editor. I'd always 
    wanted to port this program to X but didn't feel like hacking X 
    and C code to do it. Fast forward many years, to where Python + 
    Tkinter provides such a nice programming environment, with enough 
    power, that I finally buckled down and re-implemented it. I 
    changed the name because these days, too many other systems have 
    the acronym `ICE'. 

    Pynche should work with any variant of Python after 1.5.2 
    (e.g. 2.0.1 and 2.1.1), using Tk 8.0.x. It's been tested on 
    Solaris 2.6, Windows NT 4, and various Linux distros. You'll want 
    to be sure to have at least Tk 8.0.3 for Windows. Also, Pynche is 
    very colormap intensive, so it doesn't work very well on 8-bit 
    graphics cards; 24bit+ graphics cards are so cheap these days, 
    I'll probably never "fix" that. 

    Pynche must find a text database of colors names in order to 
    provide `nearest' color matching. Pynche is distributed with an 
    rgb.txt file from the X11R6.4 distribution for this reason, along 
    with other "Web related" database (see below). You can use a 
    different file with the -d option. The file xlicense.txt contains 
    the license only for rgb.txt and both files are in the X/ 
    subdirectory. 

    Pynche is pronounced: Pin'-chee 


Running Standalone 

    On Unix, start it by running the `pynche' script. On Windows, run 
    pynche.pyw to inhibit the console window. When run from the 
    command line, the following options are recognized: 

    --database file 
    -d file 
     Alternate location of the color database file. Without this 
     option, the first valid file found will be used (see below). 

    --initfile file 
    -i file 
     Alternate location of the persistent initialization file. See 
     the section on Persistency below. 

    --ignore 
    -X 
     Ignore the persistent initialization file when starting up. 
     Pynche will still write the current option settings to the 
     persistent init file when it quits. 

    --help 
    -h 
     Print the help message. 

    initialcolor 
     a Tk color name or #rrggbb color spec to be used as the 
     initially selected color. This overrides any color saved in 
     the persistent init file. Since `#' needs to be escaped in 
     many shells, it is optional in the spec (e.g. #45dd1f is the 
     same as 45dd1f). 


Running as a Modal Dialog 

    Pynche can be run as a modal dialog, inside another application, 
    say as a general color chooser. In fact, Grail 0.6 uses Pynche 
    and a future version of IDLE may as well. Pynche supports the API 
    implemented by the Tkinter standard tkColorChooser module, with a 
    few changes as described below. By importing pyColorChooser from 
    the Pynche package, you can run 

     pyColorChooser.askcolor() 

    which will popup Pynche as a modal dialog, and return the selected 
    color. 

    There are some UI differences when running as a modal 
    vs. standalone. When running as a modal, there is no "Quit" menu 
    item under the "File" menu. Instead there are "Okay" and "Cancel" 
    buttons. 

    When "Okay" is hit, askcolor() returns the tuple 

     ((r, g, b), "name") 

    where r, g, and b are red, green, and blue color values 
    respectively (in the range 0 to 255). "name" will be a color name 
    from the color database if there is an exact match, otherwise it 
    will be an X11 color spec of the form "#rrggbb". Note that this 
    is different than tkColorChooser, which doesn't know anything 
    about color names. 

    askcolor() supports the following optional keyword arguments: 

     color 
      the color to set as the initial selected color 

     master[*] 
      the master window to use as the parent of the modal 
      dialog. Without this argument, pyColorChooser will create 
      its own Tkinter.Tk instance as the master. This may not 
      be what you want. 

     databasefile 
      similar to the --database option, the value must be a 
      file name 

     initfile[*] 
      similar to the --initfile option, the value must be a 
      file name 

     ignore[*] 
      similar to the --ignore flag, the value is a boolean 

     wantspec 
      When this is true, the "name" field in the return tuple 
      will always be a color spec of the form "#rrggbb". It 
      will not return a color name even if there is a match; 
      this is so pyColorChooser can exactly match the API of 
      tkColorChooser. 

     [*] these arguments must be specified the first time 
     askcolor() is used and cannot be changed on subsequent calls. 


The Colorstrip Window 

    The top part of the main Pynche window contains the "variation 
    strips". Each strip contains a number of "color chips". The 
    strips always indicate the currently selected color by a highlight 
    rectangle around the selected color chip, with an arrow pointing 
    to the chip. Each arrow has an associated number giving you the 
    color value along the variation's axis. Each variation strip 
    shows you the colors that are reachable from the selected color by 
    varying just one axis of the color solid. 

    For example, when the selected color is (in Red/Green/Blue 
    notation) 127/127/127, the Red Variations strip shows you every 
    color in the range 0/127/127 to 255/127/127. Similarly for the 
    green and blue axes. You can select any color by clicking on its 
    chip. This will update the highlight rectangle and the arrow, as 
    well as other displays in Pynche. 

    Click on "Update while dragging" if you want Pynche to update the 
    selected color while you drag along any variation strip (this will 
    be a bit slower). Click on "Hexadecimal" to display the arrow 
    numbers in hex. 

    There are also two shortcut buttons in this window, which 
    auto-select Black (0/0/0) and White (255/255/255). 


The Proof Window 

    In the lower left corner of the main window you see two larger 
    color chips. The Selected chip shows you a larger version of the 
    color selected in the variation strips, along with its X11 color 
    specification. The Nearest chip shows you the closest color in 
    the X11 database to the selected color, giving its X11 color 
    specification, and below that, its X11 color name. When the 
    Selected chip color exactly matches the Nearest chip color, you 
    will see the color name appear below the color specification for 
    the Selected chip. 

    Clicking on the Nearest color chip selects that color. Color 
    distance is calculated in the 3D space of the RGB color solid and 
    if more than one color name is the same distance from the selected 
    color, the first one found will be chosen. 

    Note that there may be more than one X11 color name for the same 
    RGB value. In that case, the first one found in the text database 
    is designated the "primary" name, and this is shown under the 
    Nearest chip. The other names are "aliases" and they are visible 
    in the Color List Window (see below). 

    Both the color specifications and color names are selectable for 
    copying and pasting into another window. 


The Type-in Window 

    At the lower right of the main window are three entry fields. 
    Here you can type numeric values for any of the three color axes. 
    Legal values are between 0 and 255, and these fields do not allow 
    you to enter illegal values. You must hit Enter or Tab to select 
    the new color. 

    Click on "Update while typing" if you want Pynche to select the 
    color on every keystroke (well, every one that produces a legal 
    value!) Click on "Hexadecimal" to display and enter color values 
    in hex. 


Other Views 

    There are three secondary windows which are not displayed by 
    default. You can bring these up via the "View" menu on the main 
    Pynche window. 


The Text Window 

    The "Text Window" allows you to see what effects various colors 
    have on the standard Tk text widget elements. In the upper part 
    of the window is a plain Tk text widget and here you can edit the 
    text, select a region of text, etc. Below this is a button "Track 
    color changes". When this is turned on, any colors selected in 
    the other windows will change the text widget element specified in 
    the radio buttons below. When this is turned off, text widget 
    elements are not affected by color selection. 

    You can choose which element gets changed by color selection by 
    clicking on one of the radio buttons in the bottom part of this 
    window. Text foreground and background affect the text in the 
    upper part of the window. Selection foreground and background 
    affect the colors of the primary selection which is what you see 
    when you click the middle button (depending on window system) and 
    drag it through some text. 

    The Insertion is the insertion cursor in the text window, where 
    new text will be inserted as you type. The insertion cursor only 
    has a background. 


The Color List Window 

    The "Color List" window shows every named color in the color name 
    database (this window may take a while to come up). In the upper 
    part of the window you see a scrolling list of all the color names 
    in the database, in alphabetical order. Click on any color to 
    select it. In the bottom part of the window is displayed any 
    aliases for the selected color (those color names that have the 
    same RGB value, but were found later in the text database). For 
    example, find the color "Black" and you'll see that its aliases 
    are "gray0" and "grey0". 

    If the color has no aliases you'll see "<no aliases>" here. If you 
    just want to see if a color has an alias, and do not want to select a 
    color when you click on it, turn off "Update on Click". 

    Note that the color list is always updated when a color is selected 
    from the main window. There's no way to turn this feature off. If 
    the selected color has no matching color name you'll see 
    "<no matching color>" in the Aliases window. 


The Details Window 

    The "Details" window gives you more control over color selection 
    than just clicking on a color chip in the main window. The row of 
    buttons along the top apply the specified increment and decrement 
    amounts to the selected color. These delta amounts are applied to 
    the variation strips specified by the check boxes labeled "Move 
    Sliders". Thus if just Red and Green are selected, hitting -10 
    will subtract 10 from the color value along the red and green 
    variation only. Note the message under the checkboxes; this 
    indicates the primary color level being changed when more than one 
    slider is tied together. For example, if Red and Green are 
    selected, you will be changing the Yellow level of the selected 
    color. 

    The "At Boundary" behavior determines what happens when any color 
    variation hits either the lower or upper boundaries (0 or 255) as 
    a result of clicking on the top row buttons: 

    Stop 
     When the increment or decrement would send any of the tied 
     variations out of bounds, the entire delta is discarded. 

    Wrap Around 
     When the increment or decrement would send any of the tied 
     variations out of bounds, the out of bounds value is wrapped 
     around to the other side. Thus if red were at 238 and +25 
     were clicked, red would have the value 7. 

    Preserve Distance 
     When the increment or decrement would send any of the tied 
     variations out of bounds, all tied variations are wrapped as 
     one, so as to preserve the distance between them. Thus if 
     green and blue were tied, and green was at 238 while blue was 
     at 223, and +25 were clicked, green would be at 15 and blue 
     would be at 0. 

    Squash 
     When the increment or decrement would send any of the tied 
     variations out of bounds, the out of bounds variation is set 
     to the ceiling of 255 or floor of 0, as appropriate. In this 
     way, all tied variations are squashed to one edge or the 
     other. 

    The top row buttons have the following keyboard accelerators: 

    -25 == Shift Left Arrow 
    -10 == Control Left Arrow 
    -1 == Left Arrow 
    +1 == Right Arrow 
    +10 == Control Right Arrow 
    +25 == Shift Right Arrow 


Keyboard Accelerators 

    Alt-w in any secondary window dismisses the window. In the main 
    window it exits Pynche (except when running as a modal). 

    Alt-q in any window exits Pynche (except when running as a modal). 


Persistency 

    Pynche remembers various settings of options and colors between 
    invocations, storing these values in a `persistent initialization 
    file'. The actual location of this file is specified by the 
    --initfile option (see above), and defaults to ~/.pynche. 

    When Pynche exits, it saves these values in the init file, and 
    re-reads them when it starts up. There is no locking on this 
    file, so if you run multiple instances of Pynche at a time, you 
    may clobber the init file. 

    The actual options stored include 

    - the currently selected color 

    - all settings of checkbox and radio button options in all windows 

    - the contents of the text window, the current text selection and 
     insertion point, and all current text widget element color 
     settings. 

    - the name of the color database file (but not its contents) 

    You can inhibit Pynche from reading the init file by supplying the 
    --ignore option on the command line. However, you cannot suppress 
    the storing of the settings in the init file on Pynche exit. If 
    you really want to do this, use /dev/null as the init file, using 
    --initfile. 


Color Name Database Files 

    Pynche uses a color name database file to calculate the nearest 
    color to the selected color, and to display in the Color List 
    view. Several files are distributed with Pynche, described 
    below. By default, the X11 color name database file is selected. 
    Other files: 

    html40colors.txt -- the HTML 4.0 guaranteed color names 

    websafe.txt -- the 216 "Web-safe" colors that Netscape and MSIE 
    guarantee will not be dithered. These are specified in #rrggbb 
    format for both values and names 

    webcolors.txt -- The 140 color names that Tim Peters and his 
    sister say NS and MSIE both understand (with some controversy over 
    AliceBlue). 

    namedcolors.txt -- an alternative set of Netscape colors. 

    You can switch between files by choosing "Load palette..." from 
    the "File" menu. This brings up a standard Tk file dialog. 
    Choose the file you want and then click "Ok". If Pynche 
    understands the format in this file, it will load the database and 
    update the appropriate windows. If not, it will bring up an error 
    dialog. 


To Do 

    Here's a brief list of things I want to do (some mythical day): 

    - Better support for resizing the top level windows 

    - More output views, e.g. color solids 

    - Have the notion of a `last color selected'; this may require a 
     new output view 

    - Support setting the font in the text view 

    - Support distutils setup.py for installation 

    I'm open to suggestions! 




Local Variables: 
indent-tabs-mode: nil 
End: 
+0

ausgezeichnet, dieses Werkzeug erfüllt meine Anforderung präzise. danke –

0

Die Wikipedia page for web colors hat ziemlich viele von ihnen aufgeführt, ebenso wie w3schools und die verlockend genannten html-color-names.com. :-) Und this guy hat eine ernsthafte Seite über Farbe im Allgemeinen und Farbe auf Computern und im Internet speziell. Sie könnten sie besuchen, nach Ihrem Farbcode suchen und sehen, ob er aufgelistet ist (und wenn nicht, suchen Sie nach nahen).

Bearbeiten Ich verpasste das Python-Tag. Wenn Sie dies aus Code tun möchten, ist das oben genannte möglicherweise nicht 100% nützlich. Sie könnte bauen eine ziemlich gute assoziative Suche basierend auf Informationen von Websites wie das, aber auch mit Farbnamen etwas subjektiv, es scheint, als ob es wahrscheinlich eine gute algorithmische Ansatz da draußen ist.

0

This page auf Wikipedia bietet ein Beispiel für die Suche von Namen zu Hex-Codes. Es wäre ziemlich einfach, in die andere Richtung zu schauen. Ob es eine Beziehung zwischen Codes und Namen gibt, die zu Ihnen passt, liegt an Ihnen. Sie werden wahrscheinlich auch andere Farbcode-Tabellen finden.

5

Hexadezimale Web-Farbwerte sind nur eine Form von RGB. Konvertieren Sie Ihre RGB-Werte in HSL, und partitionieren Sie dann den Farbtonbereich in die verschiedenen Farben.

Zum Beispiel wäre ein Farbtonwert von etwa 0-19 "rot", 20-39 "orange", 40-59 "gelb" usw. (Diese Zahlen sind nicht genau, ich hatte nur einen kurzen Blick im Hue-Diagramm auf der Wikipedia-Seite.)

Verwenden Sie für eine komplexere Analyse des Farbnamens auch den Helligkeitswert. Zum Beispiel ist "braun" nur ein dunkleres Gelb.

+0

+1 - Ich habe in diesem Punkt vor einer Weile zurück, aber konnte nicht einmal an das Akronym erinnern. :-) –

1

Sie können dict von Hex-Codes als Schlüssel und visuell lesbare Farbnamen als Werte erstellen. Hier

ist ein heuristische/Fuzzy Funktion für erraten, was eine Farbe wie aussehen könnte;)

colorof = {'f0f8ff':"Alice Blue", 
      'faebd7':"Antique White", 
      '000000':"Black"} 

def get_color_name(hx): 
    # if color is found in dict 
    if colorof.has_key(hx):return colorof[hx] 

    # else return its closest available color 
    m = 16777215 
    k = '000000' 
    for key in colorof.keys(): 
     a = int(hx[:2],16)-int(key[:2],16) 
     b = int(hx[2:4],16)-int(key[2:4],16) 
     c = int(hx[4:],16)-int(key[4:],16) 

     v = a*a+b*b+c*C# simple measure for distance between colors 

     # v = (r1 - r2)^2 + (g1 - g2)^2 + (b1 - b2)^2 

     if v <= m: 
      m = v 
      k = key 

    return colorof[k] 

print get_color_name('f0f8ff') # found in dict 
print get_color_name('faeb11') # closest to Antique white 
+7

Das wird ein großes Diktat. '{'000000': 'schwarz', '000001': 'immernoch pechschwarz, mit einem Hauch blauer Schwärze', '000002': 'nein, immer noch ziemlich schwarz', ...}' –

+0

+1 Ya is going um 16^6 Schlüssel zu haben, aber wir könnten mit ungefähr 100 Schlüsseln und etwas Maß für die Nähe der Farbe tun. Siehe aktualisierte Antwort. Vielen Dank. –

+3

@TMC: Was ist das Problem? 16^6 ist nur 22 im Pythonhals des Waldes :-) –

0

Hier ist ein kleines Beispiel, das ich geschrieben habe, die das Pearson-Koeffizient verwendet zwei Farben zu vergleichen und wählen die ähnlichste Farbe aus einem dict.Diese Lösung ist wahrscheinlich nicht die effizienteste, aber die Ergebnisse sollten ziemlich gut sein:

import re 
re_color = re.compile('#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})') 
from math import sqrt 

def color_to_rgb(color): 
    return tuple(int(x, 16)/255.0 for x in re_color.match(color).groups()) 

def similarity(color1, color2): 
    """Computes the pearson correlation coefficient for two colors. The result 
    will be between 1.0 (very similar) and -1.0 (no similarity).""" 
    c1 = color_to_rgb(color1) 
    c2 = color_to_rgb(color2) 

    s1 = sum(c1) 
    s2 = sum(c2) 
    sp1 = sum(map(lambda c: pow(c, 2), c1)) 
    sp2 = sum(map(lambda c: pow(c, 2), c2)) 
    sp = sum(map(lambda x: x[0] * x[1], zip(c1, c2))) 

    return (sp - (s1 * s2/3.0))/sqrt((sp1 - pow(s1, 2)/3.0) * (sp2 - pow(s2, 2)/3.0)) 

color_names = { 
    '#ff0000': 'red', 
    '#00ff00': 'green', 
    '#0000ff': 'blue' 
    # add more color definitions here 
} 

def find_name(color): 
    sim = [(similarity(color, c), name) for c, name in color_names.items()] 
    return max(sim, key=lambda x: x[0])[1] 

print find_name('#cc0000') # returns "red" 
+0

Ich habe viele Farben hinzugefügt, aber Ihr Code ist auf graue Varianten (z. B. '# 000000': 'schwarz', '# 696969': 'grau', '# 808080': 'grau' usw.) –

Verwandte Themen