gpt4 book ai didi

delphi - 更改位图的色调但保留背景颜色?

转载 作者:行者123 更新时间:2023-12-03 15:09:27 24 4
gpt4 key购买 nike

我一直在尝试在 EFG 网站上找到的更改色调/饱和度示例:http://www.efg2.com/Lab/Library/Delphi/Graphics/Color.htm

enter image description here

我想使用该示例中的技术来更改某些位图的颜色值(在 TImage 上使用)。我面临一个问题,那就是具有透明位图的 TImage;我不希望背景颜色改变其色调,而只是改变实际的图像数据。

采用我们可以使用的示例图像(尽管可以使用任何具有透明度的图像):

enter image description here

  • 从顶部的链接下载更改色调/饱和度演示。
  • 现在将上面的按钮图像加载到 ImageOriginal 中。
  • 将饱和度增量设置为 1。
  • 运行项目。

一些输出结果:

enter image description here enter image description here

我想要在这里发生的是保留原始背景颜色(由最左下角像素定义)并仅调整图像其余部分的色调。因此,输出结果实际上如下所示(在 Paint.NET 中编辑):

enter image description here enter image description here

请允许我使用另一个包含更多图像数据的示例图像进行测试:

enter image description here

与之前的第一个图像示例一样,结果可能类似于:

enter image description here enter image description here

当我想要的结果应该是这样的:

enter image description here enter image description here

我的一个想法是在色调更改后,用原始颜色替换最左下角的颜色,但我不确定这是否是正确的方法,即使是,我也不确定如何将颜色 X 替换为另一种颜色。 (图形和数学超出了我的范围)。

例如,如果我在米奇的耳朵上画了两个蓝色圆圈(蓝色是最左下角像素的原始透明颜色)并给他的眼睛上色:

enter image description here

再次更改色调可能如下所示:

enter image description here

事实上它应该是这样的:

enter image description here

简单地说,我想更改图像的色调,无论是通过 EFG 演示中使用的方法还是其他解决方案。当色调更改时,最左下角像素定义的透明颜色不应更改,这应与示例图像中演示的保持一致。

如何在保留背景颜色的同时更改位图的色调?

最佳答案

您引用的代码会遍历图像上的所有像素以更改色调/饱和度。您可以修改代码,以便在像素具有特定颜色时不会干扰:

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;
..
..


输出:

enter code here

关于delphi - 更改位图的色调但保留背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com