如何在不改变亮度的情况下,将RGB图像中的红色和蓝色进行互换?
- 内容介绍
- 文章标签
- 相关推荐
本文共计408个文字,预计阅读时间需要2分钟。
我在阅读一个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;`
我正在读一个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;
因此,如果我的图像上有红色,那么它现在是蓝色的,蓝色是红色的.但问题是亮度变化,新图像比源图像更暗或更亮.
如何使输出图像像输入图像一样亮/暗?
然后转动 colorwheel(又名Hue,见下文)将红色转换为蓝色并转换回RGB.
这应该保持亮度.
德尔福有一个单位可以做到这一点:VCL.GraphUtil.
您可以使用:procedure ColorRGBToHLS(clrRGB: TColorRef; var Hue, Luminance, Saturation: Word);和function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;.
色调
Hue相当不言自明,从0开始为红色.随着它的价值增加,它会穿过彩虹的颜色.我还没有测试过GraphUtils输出的内容,但是如果一个圆有256度,则值为:
>红色0
>橙20
>黄40
>绿80
>青色120
>蓝160
>紫罗兰180
>洋红色200
>粉红色220
Embarcadero使用非标准HLS而不是HSL是没有用的,但这就是生命.
本文共计408个文字,预计阅读时间需要2分钟。
我在阅读一个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;`
我正在读一个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;
因此,如果我的图像上有红色,那么它现在是蓝色的,蓝色是红色的.但问题是亮度变化,新图像比源图像更暗或更亮.
如何使输出图像像输入图像一样亮/暗?
然后转动 colorwheel(又名Hue,见下文)将红色转换为蓝色并转换回RGB.
这应该保持亮度.
德尔福有一个单位可以做到这一点:VCL.GraphUtil.
您可以使用:procedure ColorRGBToHLS(clrRGB: TColorRef; var Hue, Luminance, Saturation: Word);和function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;.
色调
Hue相当不言自明,从0开始为红色.随着它的价值增加,它会穿过彩虹的颜色.我还没有测试过GraphUtils输出的内容,但是如果一个圆有256度,则值为:
>红色0
>橙20
>黄40
>绿80
>青色120
>蓝160
>紫罗兰180
>洋红色200
>粉红色220
Embarcadero使用非标准HLS而不是HSL是没有用的,但这就是生命.

