![](/img/trans.png)
[英]How to load a bitmap, with background color, into a TImageList in Delphi 5?
[英]Change HUE of a Bitmap but retain background color?
我一直在尝试EFG网站上的Change HUE/Saturation
示例: http : //www.efg2.com/Lab/Library/Delphi/Graphics/Color.htm
我想使用该示例中找到的技术来更改某些位图的颜色值(用于TImage)。 我面临一个问题,那就是TImages具有透明的位图; 我不希望背景颜色改变其HUE,而只是改变实际的图像数据。
拍摄我们可以使用的样本图像(尽管可以使用任何具有透明度的图像):
Change HUE/Saturation
演示。 一些输出结果:
我想在这里发生的是保持原始背景颜色(由最左下角的像素定义)并仅调整图像其余部分的色调。 因此,输出结果实际上看起来像这样(在Paint.NET中编辑):
允许我使用另一个样本图像进行测试,其中包含更多图像数据:
和之前的第一个图像样本一样,结果可能是这样的:
当我想要的结果应该是这样的:
我有一个想法是在HUE改变后,用原来的颜色替换左下角的颜色,但我不确定这是否是正确的方法,即使它是我不知道如何更换颜色X换另一种颜色。 (图形和数学超出我的范围)。
例如,如果我在Mickey的耳朵上绘制了两个蓝色圆圈(蓝色是从左下角最左边的像素的原始透明颜色)并且还涂上了他的眼睛:
再次更改HUE可能如下所示:
实际上它应该是这样的:
简单地说,我想改变图像的HUE,无论是通过EFG演示使用的方法还是其他解决方案。 当HUE更改时,不应更改由最左侧像素定义的透明颜色,这应保持与样本图像中所示的相同。
如何在保留背景颜色的同时更改位图的HUE?
您引用的代码遍历图像上的所有像素以更改色调/饱和度。 您可以修改代码,以便在像素具有特定颜色时不会干扰:
PROCEDURE TFormChangeHS.UpdateBitmap;
..
S : TReal;
V : TReal;
FixColor: TRGBTriple; // New variable
BEGIN
DeltaSaturation := SpinEditDeltaSaturation.Value;
NewHue := TrackBarHue.Position;
Bitmap := TBitmap.Create;
TRY
Bitmap.Width := ImageOriginal.Width;
Bitmap.Height := ImageOriginal.Height;
Bitmap.PixelFormat := ImageOriginal.Picture.Bitmap.PixelFormat;
ASSERT(Bitmap.PixelFormat = pf24bit);
// save bottom left color
FixColor := PRGBTripleArray(
ImageOriginal.Picture.Bitmap.ScanLine[Bitmap.Height - 1])^[0];
//--
FOR j := 0 TO Bitmap.Height-1 DO
BEGIN
RowIn := ImageOriginal.Picture.Bitmap.Scanline[j];
RowOut := Bitmap.Scanline[j];
FOR i := 0 TO Bitmap.Width-1 DO
BEGIN
WITH RowIn[i] DO
BEGIN
// copy the color to target and continue with next iteration
if (RowIn[i].rgbtBlue = FixColor.rgbtBlue) and
(RowIn[i].rgbtGreen = FixColor.rgbtGreen) and
(RowIn[i].rgbtRed = FixColor.rgbtRed) then begin
RowOut[i] := FixColor;
Continue;
end;
//--
// convert pixel coordinates to HSV
RGBtoHSV(rgbtRed, rgbtGreen, rgbtBlue, H, S, V);
END;
..
..
输出:
从理论上讲,你可以举例:
首先,你必须确定背景是什么...(可能像delphi那样选择特定像素的颜色......)
然后,使用此背景颜色,您可以基于此颜色创建蒙版...
复制图像...应用色调...
您使用掩码合并您的2位图...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.