我正在使用AsphyreSphinx框架在表单画布上绘制2D DirectX场景。由于他们的论坛已经关闭,我不得不在这里寻求帮助。我正在绘制图像以形成这样的画布:
DXCore.Canvas.UseImage(TableResources.TableImage, TexFull4);
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, clWhite4);
TableResources.TableImage
属于TAsphyreImage
类型。 DXCore.Canvas
是TAsphyreCanvas
。
这工作正常,并绘制正确的图像。但是,我还需要绘制黑色&相同图像的白色版本(去饱和)。
我曾尝试在TexMap()
中使用各种参数组合,但没有一项与去饱和图像无关。我试过的一些事情:
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, cGray4(100));
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, cRGB4(100, 100, 100));
第4个函数的参数需要TBlendingEffect
枚举,我尝试了各种组合,但没有成功。
我还尝试使用cLerp()
加载图片后手动去饱和图像,如下所示:
procedure TTableResources.ImageToGrayscale(const AImage: TAsphyreImage);
var
C1: Integer;
x, y: Integer;
begin
for C1 := 0 to AImage.TextureCount - 1 do
for x := 0 to AImage.Texture[C1].Width - 1 do
for y := 0 to AImage.Texture[C1].Height - 1 do
AImage.Texture[C1].Pixels[x, y] := cLerp(AImage.Texture[C1].Pixels[x, y], cColor(cGrayValue(AImage.Texture[C1].Pixels[x, y])), 0.8);
end;
..但是这个工作速度很慢(处理一个图像约20-30秒),并且没有返回所需的输出。
以下是他们帮助中的一些文件:
有没有人对此有更多了解,可以给我一些提示或建议我可以尝试一下吗?
答案 0 :(得分:1)
Asphyre Sphinx并非设计用于处理图像,而是用于渲染图像。它是一个适合制作游戏的图形引擎。
其原始开发人员已停止工作。目前由Pascal Game Development社区成员MarcoCestari维护。因此,如果您有任何与Asphyre Sphinx相关的问题,您可以加入PGD社区并在那里询问。这是为Asphyre Sphix库保留的特殊论坛部分:
http://www.pascalgamedevelopment.com/forumdisplay.php?25-Asphyre-Component-Pack-(formerly-PowerDraw)
现在你需要的是一些像Graphics32这样的图像处理库。
答案 1 :(得分:0)
要回答我自己的问题,想出如何去饱和它。调用时,此函数会将其转换为灰度:
procedure DesaturateImage(const AImage: TAsphyreImage);
type
PPixelRec = ^TPixelRec;
TPixelRec = packed record
B: Byte;
G: Byte;
R: Byte;
A: Byte;
end;
var
C1, x, y: Integer;
bitsp: pointer;
pitch: Integer;
bytes_per_pixel: Integer;
pixel: PPixelRec;
gray_value: Byte;
begin
for C1 := 0 to AImage.TextureCount - 1 do
begin
AImage.Texture[C1].Lock(Rect(0, 0, AImage.Texture[C1].Width, AImage.Texture[C1].Height), bitsp, pitch);
try
bytes_per_pixel := pitch div AImage.Texture[C1].Width;
for y := 0 to AImage.Texture[C1].Height - 1 do
for x := 0 to AImage.Texture[C1].Width - 1 do
begin
pixel := PPixelRec(Integer(bitsp) + y * pitch + x * bytes_per_pixel);
gray_value := Round(0.30 * pixel^.r + 0.59 * pixel^.g + 0.11 * pixel^.b);
pixel^.r := gray_value;
pixel^.g := gray_value;
pixel^.b := gray_value;
end;
finally
AImage.Texture[C1].Unlock;
end;
end;
end;