الفهرس
Color
(رسالة)
اللون
يمثّل لونًا في مساحة ألوان RGBA. تم تصميم هذا التمثيل لتسهيل التحويل من تمثيلات الألوان وإليها بلغات مختلفة بدلاً من جعله أكثر كثافة. على سبيل المثال، يمكن تقديم حقول هذا التمثيل بسهولة إلى طريقة الإنشاء الخاصة بـ 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 صراحةً). |