gpt4 book ai didi

delphi - 如何使用诸如乘法之类的混合模式来填充矩形,而不仅仅是简单的透明度

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

我使用 Delphi 库 Graphics32 在屏幕上绘制音频图形,然后表示音频中的一系列周期。

该图非常简单:黑色背景,音频波形填充浅灰色。

现在的句点是使用半透明颜色的 FillRectTS 绘制的矩形。我正在寻找一种方法(希望是简单的方法)使用“乘法”等混合模式来绘制它,因此音频波形是获得颜色的波形,而背景保持黑色。我没有在 TBitmap32 类(例如 g32_Interface 单元)中找到任何允许我执行此操作的函数。

这需要在绘制音频波形之后完成,因为按需重绘非常耗时,而且周期是用户在运行时定义的,所以直接用颜色绘制音频波形是不可能的。

这是一个小例子,说明它是怎样的,以及我想要它:

Example graphic

现在绘制句点的代码(我需要更改的方面)如下:

TColor32 ColorDibujado = Color == 0 ? GetColorDeTipoEvento(PeriodoADibujar->Evento->TipoEvento) : Color;

if (PeriodoADibujar->Habilitado == false)
ColorDibujado = (ColorDibujado & 0x00ffffff) | 0xAf000000;

Gr32::TRect area;

area.Left = (PeriodoADibujar->PosicionInicioRelativa * (double)LimitesDestino.Width()) / Proporcion + PosX;
area.Right = (PeriodoADibujar->PosicionFinRelativa * (double)LimitesDestino.Width()) / Proporcion + PosX;
area.Top = LimitesDestino.Top;
area.Bottom = LimitesDestino.Bottom;

MapaDestino->FillRectTS(area, ColorDibujado);

ColorDibujado 根据不同条件(是否选择事件以及事件类型)获取所需的透明度,但最终的想法是相同的。此代码的绘制类似于上图的第一部分。

Delphi 或 C++Builder 中的解决方案(或想法)对我来说很好。

更新

我已经直接在 Graphics32 代码上实现了这一点,使用它已经提供的任何颜色混合例程,它解决了我的需求。它是一组额外的 FillRect 函数,它采用另一个参数供混合模式使用。我会尝试将其纳入官方项目,如果它还活着的话......

最佳答案

我将以下代码添加到 Graphics32 源中,因此我可以使用该库提供的几种混合模式之一填充所需的矩形:

TBlendMode = (bmAdd, bmSub, bmDiv, bmMod, bmMax, bmMin, bmDif, bmAvg, bmExc, bmSca);

procedure TCustomBitmap32.FillRectTB(X1, Y1, X2, Y2: Integer; Value: TColor32; BlendMode: TBlendMode);
var
i, j: Integer;
P: PColor32;
blend: TBlendReg;
begin

case BlendMode of
bmAdd: blend := ColorAdd;
bmSub: blend := ColorSub;
bmDiv: blend := ColorDiv;
bmMod: blend := ColorModulate;
bmMax: blend := ColorMax;
bmMin: blend := ColorMin;
bmDif: blend := ColorDifference;
bmAvg: blend := ColorAverage;
bmExc: blend := ColorExclusion;
bmSca: blend := ColorScale;
else blend := MergeReg;
end;

try
Dec(Y2);
Dec(X2);
for j := Y1 to Y2 do
begin
P := GetPixelPtr(X1, j);
for i := X1 to X2 do
begin
P^ := blend(Value, P^);
Inc(P);
end;
end;
finally
EMMS;
Changed(MakeRect(X1, Y1, X2 + 1, Y2 + 1));
end;
end;

还有

procedure FillRectTSB(X1, Y1, X2, Y2: Integer; Value: TColor32; BlendMode: TBlendMode); overload;
procedure FillRectSB(const ARect: TRect; Value: TColor32; BlendMode: TBlendMode); overload;
procedure FillRectTSB(const ARect: TRect; Value: TColor32; BlendMode: TBlendMode); overload;

这是库提供的副本,但在内部调用新的 FillRectTB 过程。我会将这段代码提供给库维护者,这样如果对他们有意义的话,就可以将其合并到官方源代码中。

将代码放入官方库似乎并不容易,因此我在此处附加了完整的补丁,以防其他人发现这有用。

Link to patch file

我还将其发布到 Graphics32.general 新闻组中,因此它不会丢失。

关于delphi - 如何使用诸如乘法之类的混合模式来填充矩形,而不仅仅是简单的透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29044637/

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