我正在阅读24位位图:
var P: PByteArray;
...
for y:=0 to Bmp.Height-1 do begin
P := Bmp.ScanLine[y];
for x:=0 to Bmp.Width-1 do begin
R := P[3*x+2];
G := P[3*x+1];
B := P[3*x ];
现在我将RGB与BGR交换:
P[3*x+2] := B;
P[3*x+1] := G;
P[3*x ] := R;
因此,如果我的图像上有红色,那么它现在是蓝色的,蓝色是红色的。但问题是亮度变化,新图像比源图像更暗或更亮。 如何使输出图像像输入图像一样亮/暗?
答案 0 :(得分:1)
我建议您先将RGB转换为HSL 然后转动colorwheel(又名Hue,见下文)将红色转换为蓝色并转换回RGB 这应该保持亮度。
Delphi有一个单位可以做到:VCL.GraphUtil
。
您可以使用:
procedure ColorRGBToHLS(clrRGB: TColorRef; var Hue, Luminance, Saturation: Word);
和
function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;
<强>色相强>
Hue相当不言自明,从0开始为红色。随着它的价值增加,它会穿过彩虹的颜色。我还没有测试过GraphUtils输出的内容,但是如果圆形有256度,则值为:
Embarcadero使用非标准的HLS
而不是HSL
是没有用的,但这就是生命。