我使用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));函数有第四个参数,使用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;..but这个工作非常慢(大约20-30秒来处理一幅图像),并且不返回所需的输出。
以下是他们帮助的一些文件:
Asphyre.Types
Asphyre.Canvas
有没有人对此有更多的了解,并能给我一个提示或建议我可以尝试什么?
发布于 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这样的图像处理库。
发布于 2014-07-17 10:23:06
为了回答我自己的问题,我想出了如何使它去饱和的方法。此函数将在调用时将其转换为灰度:
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;https://stackoverflow.com/questions/24745080
复制相似问题