delphi – 更改位图的HUE但保留背景颜色?
我一直在尝试在EFG网站上找到的改变HUE /饱和度示例:
http://www.efg2.com/Lab/Library/Delphi/Graphics/Color.htm
我想使用该示例中找到的技术来更改某些位图的颜色值(用于TImage).我面临一个问题,那就是TImages具有透明的位图;我不希望背景颜色改变其HUE,而只是改变实际的图像数据. 拍摄我们可以使用的样本图像(尽管可以使用任何具有透明度的图像): >从顶部的链接下载更改HUE /饱和度演示. 一些输出结果: ? 我想在这里发生的是保持原始背景颜色(由最左下角的像素定义)并仅调整图像其余部分的色调.因此,输出结果实际上看起来像这样(在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; .. .. 输出: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |