gpt4 book ai didi

delphi - 以编程方式将颜色从加载的位图逐像素交换为红色、绿色、蓝色或灰色

转载 作者:行者123 更新时间:2023-12-02 07:51:01 33 4
gpt4 key购买 nike

在此处下载源代码:http://www.eyeClaxton.com/download/delphi/ColorSwap.zip

是的,我想将“主要是蓝色”的内容转换为“主要是绿色”的内容。

我想获取原始位图(浅蓝色)并将颜色(逐像素)更改为红色、绿色、蓝色和灰色等价关系。为了理解我的意思,我提供了源代码和屏幕截图。任何帮助将不胜感激。如果需要更多信息,请随时询问。

如果您可以看一下下面的代码,我正在寻求三个函数的帮助。函数“RGBToRed、RGBToGreen 和 RGBToRed”我似乎无法想出正确的公式。

alt text

unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TMainFrm = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Panel2: TPanel;
Label2: TLabel;
Button1: TButton;
BeforeImage1: TImage;
AfterImage1: TImage;
RadioGroup1: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainFrm: TMainFrm;

implementation

{$R *.DFM}
function RGBToGray(RGBColor: TColor): TColor;
var
Gray: Byte;
begin
Gray := Round(
(0.90 * GetRValue(RGBColor)) +
(0.88 * GetGValue(RGBColor)) +
(0.33 * GetBValue(RGBColor)));

Result := RGB(Gray, Gray, Gray);
end;

function RGBToRed(RGBColor: TColor): TColor;
var
Red: Byte;
begin
// Not sure of the algorithm for this color
Result := RGB(Red, Red, Red);
end;

function RGBToGreen(RGBColor: TColor): TColor;
var
Green: Byte;
begin
// Not sure of the algorithm for this color
Result := RGB(Green, Green, Green);
end;

function RGBToBlue(RGBColor: TColor): TColor;
var
Blue: Byte;
begin
// Not sure of the algorithm for this color
Result := RGB(Blue, Blue, Blue);
end;

procedure TMainFrm.FormCreate(Sender: TObject);
begin
BeforeImage1.Picture.LoadFromFile('Images\RightCenter.bmp');
end;

procedure TMainFrm.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
I, X: Integer;
Color: Integer;
begin
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile('Images\RightCenter.bmp');

for X := 0 to Bitmap.Height do
begin
for I := 0 to Bitmap.Width do
begin
Color := ColorToRGB(Bitmap.Canvas.Pixels[I, X]);

case Color of
$00000000: ; // Skip any Color Here!
else
case RadioGroup1.ItemIndex of
0: Bitmap.Canvas.Pixels[I, X] := RGBToBlue(Color);
1: Bitmap.Canvas.Pixels[I, X] := RGBToRed(Color);
2: Bitmap.Canvas.Pixels[I, X] := RGBToGreen(Color);
3: Bitmap.Canvas.Pixels[I, X] := RGBToGray(Color);
end;
end;
end;
end;
AfterImage1.Picture.Graphic := Bitmap;
finally
Bitmap.Free;
end;
end;

end.

好吧,我很抱歉没有说清楚。我正在尝试获取位图(蓝色)并将蓝色像素替换为另一种颜色。就像下面的照片一样。

alt text

alt text

最佳答案

我不知道你想达到什么目的。首先,这个问题与equivalence relations有什么关系? ?

二、代码

function RGBToRed(RGBColor: TColor): TColor;
var
Red: Byte;
begin
// Not sure of the algorithm for this color
Result := RGB(Red, Red, Red);
end;

没有意义。返回值未定义。 RGB函数采用 0 到 255 范围内的红色、绿色和蓝色强度,并返回 TColor拥有这些组件。例如,RGB(255, 0, 0)是纯红色,即255红、0绿、0蓝。然而,在上面的代码中,Red未初始化,所以Result可以是任何灰色(取决于Red恰好是什么)。 [而且,正如您可能知道的那样,如果您将等量的红色、绿色和蓝色混合在一起,就会得到灰色。] 例如,Red一次运行应用程序时,可能碰巧是 45,然后结果将是灰色 RGB(45, 45, 45) 。下次可能是 163。

也许您想要一个接受 TColor 的函数并返回它的红色分量?然后GetRValue就可以了,当然还有GetGValueGetBValue .

或者,也许您想从给定的 TColor 创建灰色。 ,就像使用 Photoshop 从彩色图像创建灰度图像时所做的那样。那么,如果ColorTColor ,合适的灰度值为

grey := (GetRValue(Color) + GetGValue(Color) + GetBValue(Color)) div 3;

还有其他方法可以做到这一点(导致灰度图像略有不同,但这是最简单(也是最快)的)。 (例如,您可以将颜色从 RGB 转换为 HSV 或 HSL,然后将饱和度设置为零。)

更新

我想我明白你想做什么。也许您想提取红色、绿色和蓝色 channel 。也就是说,你想要变换每个像素 RGB(R, G, B)RGB(R, 0, 0)在红色的情况下。如果这是您想做的,那么您应该这样做

function RGBToRed(RGBColor: TColor): TColor;
begin
Result := RGB(GetRValue(RGBColor), 0, 0);
end;

对于其他组件也类似,即

function RGBToGreen(RGBColor: TColor): TColor;
begin
Result := RGB(0, GetGValue(RGBColor), 0);
end;

function RGBToBlue(RGBColor: TColor): TColor;
begin
Result := RGB(0, 0, GetBValue(RGBColor));
end;

或者,也许

或者您可能只想将图像设为灰度,然后将其“着色”为红色(或绿色或蓝色)。那么你需要重型机械。理论上,您希望替换 HSV(h, s, v) 中的每个像素。至HSV(0, s, v)在红色的情况下,HSV(120, s, v)在绿色的情况下,和 HSV(240, s, v)在蓝色的情况下。或者,也许您还希望设置饱和度 s到 1。

我使用以下程序在 RGB 和 HSV 之间进行转换:

function RGBToHSV(const Color: TRGB): THSV;
var
cmax, cmin, cdiff: real;
begin
cmax := MaxComponent(Color);
cmin := MinComponent(Color);
cdiff := cmax - cmin;

with Color, result do
begin

// Hue
if cmax = cmin then
hsvHue := 0
else if cmax = rgbRed then
hsvHue := (60 * (rgbGreen - rgbBlue) / cdiff)
else if cmax = rgbGreen then
hsvHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
else
hsvHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;

hsvHue := Fix360(hsvHue);

// Saturation
if cmax = 0 then
hsvSaturation := 0
else
hsvSaturation := 1 - cmin / cmax;

// Value
hsvValue := cmax;

end;

end;

function HSVToRGB(const Color: THSV): TRGB;
var
hi: integer;
f, q, p, t: real;
begin

with Color do
begin

hi := floor(hsvHue / 60) mod 6;
f := hsvHue / 60 - floor(hsvHue / 60);
p := hsvValue * (1 - hsvSaturation);
q := hsvValue * (1 - f * hsvSaturation);
t := hsvValue * (1 - (1 - f) * hsvSaturation);

case hi of
0: result := RGB(hsvValue, t, p);
1: result := RGB(q, hsvValue, p);
2: result := RGB(p, hsvValue, t);
3: result := RGB(p, q, hsvValue);
4: result := RGB(t, p, hsvValue);
5: result := RGB(hsvValue, p, q);
end;

end;

end;

哪里

type
TRGB = record
rgbRed, // red intensity between 0 and 1
rgbGreen, // green intensity between 0 and 1
rgbBlue: double; // blue intensity between 0 and 1
end;

THSV = record
hsvHue, // hue angle between 0 and 360
hsvSaturation, // saturation between 0 (grey) and 1 (full colour)
hsvValue: double; // value between 0 (dark) and 1 ("normal")
end;

最终结果,在绿色的情况下,将是这样的

Hue fixed to 120

第一种情况(色调固定为 120)和

Hue fixed to 120 and saturation fixed to 1

在后一种情况下(色调固定为 120,饱和度固定为 1)。

或者,可能

即使经过编辑,您的问题也非常大胆。您想要将“主要是蓝色”的内容转换为“主要是绿色”的内容。但有一千种方法可以做到这一点!当然,一个很简单的方法就是将蓝绿 channel 互换,即替换RGB(r, g, b)RGB(r, b, g) ,或者明确地,

function SwapBlueGreen(Color: TColor): TColor;
begin
result := RGB(GetRValue(Color), GetBValue(Color), GetGValue(Color));
end;

然后你会得到类似的东西

R and G channels swapped

红色和绿色 channel 已交换。请注意,红棍现在是绿色的,绿草现在是红色的。白色的东西仍然是白色的。

终于

欢迎来到像素图操作的世界!有很多简单而有趣的事情可以做。我的更多例子:https://english.rejbrand.se/algosim/manual/pmproc/pmproc.html

关于delphi - 以编程方式将颜色从加载的位图逐像素交换为红色、绿色、蓝色或灰色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4642521/

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