AsphyreSphinx - 如何去饱和图像

时间:2014-07-14 20:11:27

标签: delphi directx delphi-xe2 directx-9

我正在使用AsphyreSphinx框架在表单画布上绘制2D DirectX场景。由于他们的论坛已经关闭,我不得不在这里寻求帮助。我正在绘制图像以形成这样的画布:

DXCore.Canvas.UseImage(TableResources.TableImage, TexFull4);
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, clWhite4);

TableResources.TableImage属于TAsphyreImage类型。 DXCore.CanvasTAsphyreCanvas。 这工作正常,并绘制正确的图像。但是,我还需要绘制黑色&相同图像的白色版本(去饱和)。

我曾尝试在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秒),并且没有返回所需的输出。

以下是他们帮助中的一些文件:

Asphyre.Types

Asphyre.Canvas

有没有人对此有更多了解,可以给我一些提示或建议我可以尝试一下吗?

2 个答案:

答案 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;