首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsphyreSphinx -如何去饱和图像

AsphyreSphinx -如何去饱和图像
EN

Stack Overflow用户
提问于 2014-07-14 20:11:26
回答 2查看 193关注 0票数 1

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

代码语言:javascript
复制
DXCore.Canvas.UseImage(TableResources.TableImage, TexFull4);
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, clWhite4);

TableResources.TableImageTAsphyreImage型的。DXCore.CanvasTAsphyreCanvas。这是很好的工作,并绘制适当的形象。但是,我也需要绘制相同图像的黑白版本(去饱和)。

我尝试过在TexMap()中使用各种参数的组合,但是没有一个给出接近去饱和图像的结果。有些事我试过了:

代码语言:javascript
复制
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, cGray4(100));
DXCore.Canvas.TexMap(FMetrics.RawTableBounds, cRGB4(100, 100, 100));

函数有第四个参数,使用TBlendingEffect枚举,我也尝试了各种组合,但都没有成功。

在加载图像后,我还尝试使用cLerp()手动去饱和图像,如下所示:

代码语言:javascript
复制
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;

..but这个工作非常慢(大约20-30秒来处理一幅图像),并且不返回所需的输出。

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

Asphyre.Types

Asphyre.Canvas

有没有人对此有更多的了解,并能给我一个提示或建议我可以尝试什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-15 08:47:47

Asphyre狮身人面像不是为处理图像而设计的,而是用来渲染图像的。这是一个图形引擎,适合制作游戏。

它原来的开发者已经停止了它的工作。目前它是由一个名为MarcoCestari的Pascal游戏开发公司的成员维护的。因此,如果您有任何与Asphyre狮身人面像相关的问题,您可以加入PGD公司并在那里提问。这是一个专门为Asphyre Sphix图书馆保留的论坛部分:

http://www.pascalgamedevelopment.com/forumdisplay.php?25-Asphyre-Component-Pack-(formerly-PowerDraw)

现在,您需要的是一些像Graphics32这样的图像处理库。

票数 1
EN

Stack Overflow用户

发布于 2014-07-17 10:23:06

为了回答我自己的问题,我想出了如何使它去饱和的方法。此函数将在调用时将其转换为灰度:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24745080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档