如何在RGB图像中用红与蓝交换并保持亮度



我正在读取一个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  ];

现在我用BGR:交换RGB

      P[3*x+2] := B;
      P[3*x+1] := G;
      P[3*x  ] := R;

因此,如果我的图像上有红色的东西,现在它是蓝色的,而以前的蓝色是红色。但问题是亮度发生了变化,新图像比源图像更暗或更亮。如何使输出图像与输入图像一样亮/暗?

我建议您首先将RGB转换为HSL
然后转动色轮(也称为"色调",见下文),将红色转换为蓝色,并转换回RGB
这样可以保持亮度。

Delphi有一个这样的单元:VCL.GraphUtil

您可以使用:
procedure ColorRGBToHLS(clrRGB: TColorRef; var Hue, Luminance, Saturation: Word);
function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;

色调

色调是不言自明的,红色从0开始。随着其值的增加,它会穿过彩虹的颜色。我还没有测试GraphUtils的输出,但如果一个圆有256度,则值为:

  • 红色0
  • 橙色20
  • 黄色40
  • 绿色80
  • 青色120
  • 蓝色160
  • 紫色180
  • 品红色200
  • 粉红色220

Embarcadero使用非标准的HLS而不是HSL是没有帮助的,但这就是生活

最新更新