Индекс
-
Color
(сообщение)
Цвет
Представляет цвет в цветовом пространстве RGBA. Это представление предназначено для простоты преобразования в цветовые представления на разных языках и обратно, а не для компактности. Например, поля этого представления можно тривиально передать конструктору java.awt.Color
в Java; его также можно тривиально передать методу +colorWithRed:green:blue:alpha
UIColor в iOS; и, приложив немного усилий, его можно легко отформатировать в строку CSS rgba()
в JavaScript.
На этой справочной странице нет информации об абсолютном цветовом пространстве, которое следует использовать для интерпретации значения RGB, например sRGB, Adobe RGB, DCI-P3 и BT.2020. По умолчанию приложения должны использовать цветовое пространство sRGB.
Когда необходимо определить равенство цветов, реализации, если не указано иное, рассматривают два цвета как равные, если все их значения красного, зеленого, синего и альфа отличаются не более чем на 1e-5
.
Пример (Java):
import com.google.type.Color;
// ...
public static java.awt.Color fromProto(Color protocolor) {
float alpha = protocolor.hasAlpha()
? protocolor.getAlpha().getValue()
: 1.0;
return new java.awt.Color(
protocolor.getRed(),
protocolor.getGreen(),
protocolor.getBlue(),
alpha);
}
public static Color toProto(java.awt.Color color) {
float red = (float) color.getRed();
float green = (float) color.getGreen();
float blue = (float) color.getBlue();
float denominator = 255.0;
Color.Builder resultBuilder =
Color
.newBuilder()
.setRed(red / denominator)
.setGreen(green / denominator)
.setBlue(blue / denominator);
int alpha = color.getAlpha();
if (alpha != 255) {
result.setAlpha(
FloatValue
.newBuilder()
.setValue(((float) alpha) / denominator)
.build());
}
return resultBuilder.build();
}
// ...
Пример (iOS/Obj-C):
// ...
static UIColor* fromProto(Color* protocolor) {
float red = [protocolor red];
float green = [protocolor green];
float blue = [protocolor blue];
FloatValue* alpha_wrapper = [protocolor alpha];
float alpha = 1.0;
if (alpha_wrapper != nil) {
alpha = [alpha_wrapper value];
}
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
static Color* toProto(UIColor* color) {
CGFloat red, green, blue, alpha;
if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
return nil;
}
Color* result = [[Color alloc] init];
[result setRed:red];
[result setGreen:green];
[result setBlue:blue];
if (alpha <= 0.9999) {
[result setAlpha:floatWrapperWithValue(alpha)];
}
[result autorelease];
return result;
}
// ...
Пример (JavaScript):
// ...
var protoToCssColor = function(rgb_color) {
var redFrac = rgb_color.red || 0.0;
var greenFrac = rgb_color.green || 0.0;
var blueFrac = rgb_color.blue || 0.0;
var red = Math.floor(redFrac * 255);
var green = Math.floor(greenFrac * 255);
var blue = Math.floor(blueFrac * 255);
if (!('alpha' in rgb_color)) {
return rgbToCssColor(red, green, blue);
}
var alphaFrac = rgb_color.alpha.value || 0.0;
var rgbParams = [red, green, blue].join(',');
return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
};
var rgbToCssColor = function(red, green, blue) {
var rgbNumber = new Number((red << 16) | (green << 8) | blue);
var hexString = rgbNumber.toString(16);
var missingZeros = 6 - hexString.length;
var resultBuilder = ['#'];
for (var i = 0; i < missingZeros; i++) {
resultBuilder.push('0');
}
resultBuilder.push(hexString);
return resultBuilder.join('');
};
// ...
Поля | |
---|---|
red | Количество красного цвета в цвете как значение в интервале [0, 1]. |
green | Количество зеленого цвета в цвете как значение в интервале [0, 1]. |
blue | Количество синего цвета в цвете как значение в интервале [0, 1]. |
alpha | Доля этого цвета, которая должна быть применена к пикселю. То есть конечный цвет пикселя определяется уравнением: Это означает, что значение 1,0 соответствует сплошному цвету, тогда как значение 0,0 соответствует полностью прозрачному цвету. При этом используется сообщение-оболочка, а не простой скаляр с плавающей запятой, чтобы можно было отличить значение по умолчанию от значения, которое не установлено. Если этот параметр опущен, этот цветовой объект отображается как сплошной цвет (как если бы значению альфа было явно присвоено значение 1,0). |