2015-03-08 3 views
0

У меня есть этот кусок кода, который получает цвет RGB, когда изображение щелкнули:Получить имя цвета из кода RGB?

public boolean onTouch(View v, MotionEvent event) { 
       int x = (int) event.getX(); 
       int y = (int) event.getY(); 
       final Bitmap bitmap = ((BitmapDrawable) image.getDrawable()) 
         .getBitmap(); 
       int pixel = bitmap.getPixel(x, y); 
       redValue = Color.red(pixel); 
       blueValue = Color.blue(pixel); 
       greenValue = Color.green(pixel); 


       tv_selected_colour.setText(""+redValue+""+blueValue+""+greenValue); 

       return false; 
      } 
     }); 

Мне нужно разобраться в цвет имя (красный, зеленый и т.д.) от значения RGB. Это возможно?

+2

Цветное имя? Это немного абсурдно в наше время, у кого есть время, чтобы найти 16,7 миллиона разных имен? –

+0

да, но это мои требования к проекту – user4440416

+0

sth like: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.birt.doc.isv%2Fmodel%2Fapi%2Forg%2Feclipse%2Fbirt % 2Freport% 2Fmodel% 2Fapi% 2Futil% 2FColorUtil.html ?? – mico

ответ

2

Несколько лет назад Рэндалл Монро (из XKCD) сделал large online survey of English-speakers, результатом чего стал list of over 900 colour names. Вы можете легко использовать эти данные в качестве основы функции присвоения цвета, которая преобразует триплет RGB в имя ближайшего цвета. Это то, что простая реализация будет выглядеть в C, например:

#include <stdio.h> 
#define squared(X) ((X) * (X)) 

typedef struct { 
    char *name; 
    unsigned char r, g, b; 
} color_name; 

/* Source: http://xkcd.com/color/rgb.txt */ 
/* License: http://creativecommons.org/publicdomain/zero/1.0/ */ 
static const color_name xkcd_colors[] = { 
    {"cloudy blue",0xac,0xc2,0xd9}, {"dark pastel green",0x56,0xae,0x57}, 
    {"dust",0xb2,0x99,0x6e}, {"electric lime",0xa8,0xff,0x04}, 
      : 
     (et cetera) 
      : 
    {"blue",0x03,0x43,0xdf}, {"green",0x15,0xb0,0x1a}, 
    {"purple",0x7e,0x1e,0x9c} 
}; 

int main(int argc, char *argv[]) { 
    int red, green, blue, d2, mind2, i, result; 
    if (argc != 2 ||sscanf(argv[1],"%02x%02x%02x",&red,&green,&blue) != 3) 
    return !puts("Provide 6 hex chars as command line argument."); 

    mind2 = 256 * 256 * 3; 
    for (i=0; i<sizeof(xkcd_colors)/sizeof(color_name); i++) { 
    d2 = squared(red - xkcd_colors[i].r) + /* Calculate squared */ 
     squared(green - xkcd_colors[i].g) + /* distance from each */ 
     squared(blue - xkcd_colors[i].b); /* color in list.  */ 
    if (d2 < mind2) { 
     mind2 = d2; /* Find the minimum distance and */ 
     result = i; /* store the index of this color */ 
    } 
    } 
    printf("That color is called \"%s\"\n",xkcd_colors[result].name); 
    return 0; 
} 

ПРИМЕЧАНИЕ: Вы можете основывать свою функции на разный набор данных, если вы не хотите, чтобы он дал результаты например «baby shit brown» (# ad900d) или «puke» (# a5a502), но принцип тот же.

Смежные вопросы