אינדקס
Color(הודעה)
צבע
מייצג צבע במרחב הצבעים RGBA. הייצוג הזה נועד לפשט את ההמרה אליו וממנו של ייצוגי צבעים בשפות שונות, על חשבון הקומפקטיות. לדוגמה, אפשר לספק בקלות את השדות של הייצוג הזה למבנה ה-constructor של java.awt.Color ב-Java, ואפשר גם לספק אותו בקלות לשיטה +colorWithRed:green:blue:alpha של UIColor ב-iOS. בנוסף, אפשר לעצב אותו בקלות כמחרוזת rgba() של CSS ב-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). |