How can I convert a color name to a 3 element RGB vector?

后端 未结 4 1597
-上瘾入骨i
-上瘾入骨i 2021-01-12 18:51

In many MATLAB plotting functions, you can specify the color as either a string or as a 3 element vector that directly lists the red, green, and blue values.

For ins

相关标签:
4条回答
  • 2021-01-12 19:23

    here's a oneliner you don't have to solve for C:

    str2rgb=@(x)get(line('color',x),'color');
    

    Now str2rgb gives you the answer. for example str2rgb('c') = [0 1 1].

    0 讨论(0)
  • 2021-01-12 19:28

    I found this general alternative on the MathWorks File Exchange which will even handle color strings other than the default 8 in MATLAB:

    • rgb.m by Ben Mitch

    If you're only concerned with conversions for the default 8 color strings, here's a function I wrote myself that I use to convert back and forth between RGB triples and short color names (i.e. single characters):

    function outColor = convert_color(inColor)
    
      charValues = 'rgbcmywk'.';  %#'
      rgbValues = [eye(3); 1-eye(3); 1 1 1; 0 0 0];
      assert(~isempty(inColor),'convert_color:badInputSize',...
             'Input argument must not be empty.');
    
      if ischar(inColor)  %# Input is a character string
    
        [isColor,colorIndex] = ismember(inColor(:),charValues);
        assert(all(isColor),'convert_color:badInputContents',...
               'String input can only contain the characters ''rgbcmywk''.');
        outColor = rgbValues(colorIndex,:);
    
      elseif isnumeric(inColor) || islogical(inColor)  %# Input is a numeric or
                                                       %#   logical array
        assert(size(inColor,2) == 3,'convert_color:badInputSize',...
               'Numeric input must be an N-by-3 matrix');
        inColor = double(inColor);           %# Convert input to type double
        scaleIndex = max(inColor,[],2) > 1;  %# Find rows with values > 1
        inColor(scaleIndex,:) = inColor(scaleIndex,:)./255;  %# Scale by 255
        [isColor,colorIndex] = ismember(inColor,rgbValues,'rows');
        assert(all(isColor),'convert_color:badInputContents',...
               'RGB input must define one of the colors ''rgbcmywk''.');
        outColor = charValues(colorIndex(:));
    
      else  %# Input is an invalid type
    
        error('convert_color:badInputType',...
              'Input must be a character or numeric array.');
    
      end
    

    Note that this function allows you to input either a string of characters or an N-by-3 numeric or logical array (with RGB values from 0 to 1 or 0 to 255) and it returns the opposite color representation. It also uses the function ISMEMBER to do the conversions.

    0 讨论(0)
  • 2021-01-12 19:46

    I don't think there is a function for this in matlab. I suggest you use Marcs function, or this one-liner.

    C = rem(floor((strfind('kbgcrmyw', C) - 1) * [0.25 0.5 1]), 2); 
    
    0 讨论(0)
  • 2021-01-12 19:46

    In case there isn't, I just hacked one together

    function rgbvec = char2rgb (charcolor)
    %function rgbvec = char2rgb (charcolor)
    %
    %converts a character color (one of 'r','g','b','c','m','y','k','w') to a 3
    %value RGB vector
    %if charcolor is a string (vector of chars), the result is a Nx3 matrix of
    %color values, where N is the length of charcolor
    
    if (~exist(charcolor,'var') || ~ischar(charcolor))
        warning('RGB2VEC:NOTC', 'You must pass a character (rgbcmykw)');
        rgbvec = [0 0 0];
        return;
    end
    rgbvec = zeros(length(charcolor), 3);
    charwarning = false;
    for j = 1:length(charcolor)
        switch(lower(charcolor(j)))
            case 'r'
                rgbvec(j,:) = [1 0 0];
            case 'g'
                rgbvec(j,:) = [0 1 0];
            case 'b'
                rgbvec(j,:) = [0 0 1];
            case 'c'
                rgbvec(j,:) = [0 1 1];
            case 'm'
                rgbvec(j,:) = [1 0 1];
            case 'y'
                rgbvec(j,:) = [1 1 0];
            case 'w'
                rgbvec(j,:) = [1 1 1];
            case 'k'
                rgbvec(j,:) = [0 0 0];
            otherwise
                charwarning = true;
        end
    end
    
    if (charwarning)
        warning('RGB2VEC:BADC', 'Only r,g,b,c,m,y,k,and w are recognized colors');
    end
    
    0 讨论(0)
提交回复
热议问题