-7

元気かい?配列やファイルに保存せずに色名を出力する C 言語の方法があるかどうかを尋ねたい..特定の色のコードを入力すると、プログラムは #FFFFFFF などの場合に白を出力するように.そんな感じ??プロジェクトに膨大な数の色名が必要です

4

2 に答える 2

3

何かが何色であるかを計算することができます - 例えば、赤と青が優勢なものは「紫」になり、「赤」が多く、他の部分は「赤」ではなく、レベルが高い場合は「明るい」、レベルが「低い」暗いです。しかし、まだ膨大な数の色の組み合わせがあり、HTML の色から組み合わせることができる 16777216 色の​​すべてを名前と呼ぶことはできません。

808080 を「ミディアムグレー」と呼ぶとしたら、ほぼ同じ 818181 と 7f7f7f を何と呼びますか?

(そして「配列を使用しない」と、おそらくこれはほとんど不可能になります。もちろん、「配列」の代わりに「コードテーブル」を作成することもできます。たとえば、スイッチまたは if ステートメントの長いチェーンを使用します。プロセスの計算では、最初に配列を使用する代わりに、コンパイラにテーブルを作成させているだけです)

これは、色に名前を付けるコードの一部です。完全とは言えませんが、ある程度のアイデアが得られるかもしれません...私はある程度の柔軟性を備えたものを実現しようとしました。同様のことを達成する方法は他にもあります。しかし、それは簡単な刺し傷であり、さらに数時間費やして、意味のある入力データが得られたと確信しています [色を思いつく想像力が不足しています...]

#include <stdio.h>
#include <string.h>

typedef struct tColourDef
{
    int r;
    int g;
    int b;
    const char *colour;
} ColourDef;


// Portion up the colours in 1/8 of the range, 0-7. 

static ColourDef baseColours[] = 
{
    { 0, 0, 0, "Unknown" },
    { 0, 0, 0, "Black" },
    { 7, 7, 7, "White" },
    { 7, 0, 0, "Red" },
    { 0, 7, 0, "Green" },
    { 0, 0, 7, "Blue" },
    { 7, 7, 0, "Yellow" },
    { 4, 4, 4, "Gray" },
    { 7, 0, 4, "Pink" },
    { 5, 2, 0, "Brown" },
    { 7, 0, 5, "Magenta" },
    { 0, 7, 7, "Cyan" },
    { 4, 0, 4, "Purple" },
    { 7, 3, 0, "Orange" },
    { 4, 0, 0, "Maroon" },
    { 5, 0, 7, "Violet" },
    { 2, 6, 6, "Turqoise" },
};

#define NCOLOURS (sizeof baseColours/sizeof baseColours[0])

inline int iabs(int x)
{
    if (x < 0) return -x;
    return x;
}

int FindColour(int r, int g, int b, char *buffer, size_t buffer_size)
{
    int i;
    // Shift colour down... 
    r >>= 5;
    g >>= 5;
    b >>= 5;
    int smallestError = 5;   // Bigger than this, and we say "unknown".
    int bestIndex = 0;       // Point at "unknown"
    for(i = 1; i < NCOLOURS; i++)
    {
        int error;
        error = abs(r - baseColours[i].r) +
            abs(b - baseColours[i].b) + 
            abs(g - baseColours[i].g);
        if (error < smallestError && error < 3)
        {
            smallestError = error;
            bestIndex = i;
        }
    }
    strncpy(buffer, baseColours[bestIndex].colour, buffer_size);
    return (bestIndex > 0);
}


int main()
{
    int testColours[] = { 0xFF0000, 
                          0x00FF00, 
                          0x0000FF, 
                          0x008080, 
                          0x808080,
                          0x770000,
                          0xf01780,
                          0x333333,
    };
    int i; 
    for(i = 0; i < sizeof testColours / sizeof testColours[0]; i++)
    {
        int r = testColours[i] >> 16;
        int g = (testColours[i] >> 8) & 0xff;
        int b = testColours[i] & 0xff;
        char buffer[30];
        int res = FindColour(r, g, b, buffer, sizeof(buffer));
        printf("%02x:%02x:%02x = %s\n", r, g, b, buffer);
    }
    return 0;
}
于 2013-09-08T19:47:56.883 に答える