使用PHP和Imagick将PNG转换为DDS

使用PHP和Imagick将PNG转换为DDS,php,imagemagick,imagick,Php,Imagemagick,Imagick,用户可以在我们的网页上为我们玩的游戏创建自己的皮肤。在创建它们的皮肤之后,我必须将它们转换为DDS文件。因此,如果Imagick可以直接转换为BC3 DXT5 DDS文件,我将节省很多时间 $img = new Imagick('test.png'); //Load the uploaded image $img->setformat('dds'); //Set the format to dds $img->setImageCompression(Imagick::COMPRESS

用户可以在我们的网页上为我们玩的游戏创建自己的皮肤。在创建它们的皮肤之后,我必须将它们转换为DDS文件。因此,如果Imagick可以直接转换为BC3 DXT5 DDS文件,我将节省很多时间

$img = new Imagick('test.png'); //Load the uploaded image
$img->setformat('dds'); //Set the format to dds
$img->setImageCompression(Imagick::COMPRESSION_DXT5); //Set compression method
$img->writeimage('test.dds'); //Write/save the dds texture
要转换的PNG:
转换后的DDS:

如果我用上面的代码转换PNG图像,我会得到一个dds文件,它在十六进制编辑器中看起来像一团乱。收割台完全坏了。 我也无法在Photoshop中打开dds文件(使用dds插件),因为Photoshop说“无法打开文件,因为无法解释文件格式”

我使用的版本:

PHP版本7.1.6-nmm1(其他PHP版本不变)
imagick模块版本3.4.3RC1
使用ImageMagick版本ImageMagick 6.7.7-10 2016-11-29 Q16编译Imagick
使用ImageMagick库版本ImageMagick 6.7.7-10 2017-07-31 Q16编译Imagick

我使用PHP版本是因为我只有一个普通的Web空间。该代码在两个不同的Web空间上不起作用,因此我认为Imagick中的dds转换已损坏

PHP代码是否错误或Imagick DDS是否损坏。
有什么想法吗?

我不太了解伊玛吉克。但是从Imagemagick格式页面:
使用-define指定压缩(例如-define dds:compression={dxt1,dxt5,none})。其他定义包括dds:cluster fit={true,false},dds:weight by alpha={true,false},dds:fast mipmaps={true,false},并使用dds:mipmaps设置mipmaps的数量(使用fromlist使用图像列表)。
因此Imagick setImageCompression可能不适用于dds。如果在代码中省略该行,会发生什么?它有用吗?在Imagemagick 6.9.9.18命令行中,这对我来说很好:
convert test.png test.dds
测试Imagemagick版本的另一种方法是通过PHP exec()运行我的命令
convert test.png test.dds
,查看是否生成有效文件。这样,您就可以知道问题所在的位置是Imagemagick还是Imagick。DDS是“Microsoft Direct Draw Surface”吗?您可以十六进制转储有效DDS文件的前50-80字节吗?然后IM创建了DDS文件?你为什么要使用一个4年多以前的IM版本?@fmw42,我可以用PHP exec()创建一个dds文件,如果不知道转换器路径,我就不知道它能工作。它生成与上面的PHP代码相同的dds文件和内容。列表中的其他定义选项也没有任何更改@MarkSetchell,它是“MicrosoftDirectDrawSurface”,因为它只是一个普通的Web空间,无法访问模块,所以php.ini等。我无法将IM版本更改为较新版本。
@Mark Setchell
那些版本的6.7.7.10已经过修补,但没有升级原始版本号。您可以通过与版本关联的日期来判断。但是,有些时候补丁没有正确完成。然而,很可能两个补丁,特别是第一个补丁都不是最新的。我听说有些补丁做得不好,或者需要用更新的补丁替换。然而,我对Imagick以及它如何使用Imagemagick的补丁版本不太了解,我对Imagick不太了解。但是从Imagemagick格式页面:
使用-define指定压缩(例如-define dds:compression={dxt1,dxt5,none})。其他定义包括dds:cluster fit={true,false},dds:weight by alpha={true,false},dds:fast mipmaps={true,false},并使用dds:mipmaps设置mipmaps的数量(使用fromlist使用图像列表)。
因此Imagick setImageCompression可能不适用于dds。如果在代码中省略该行,会发生什么?它有用吗?在Imagemagick 6.9.9.18命令行中,这对我来说很好:
convert test.png test.dds
测试Imagemagick版本的另一种方法是通过PHP exec()运行我的命令
convert test.png test.dds
,查看是否生成有效文件。这样,您就可以知道问题所在的位置是Imagemagick还是Imagick。DDS是“Microsoft Direct Draw Surface”吗?您可以十六进制转储有效DDS文件的前50-80字节吗?然后IM创建了DDS文件?你为什么要使用一个4年多以前的IM版本?@fmw42,我可以用PHP exec()创建一个dds文件,如果不知道转换器路径,我就不知道它能工作。它生成与上面的PHP代码相同的dds文件和内容。列表中的其他定义选项也没有任何更改@MarkSetchell,它是“MicrosoftDirectDrawSurface”,因为它只是一个普通的Web空间,无法访问模块,所以php.ini等。我无法将IM版本更改为较新版本。
@Mark Setchell
那些版本的6.7.7.10已经过修补,但没有升级原始版本号。您可以通过与版本关联的日期来判断。但是,有些时候补丁没有正确完成。然而,很可能两个补丁,特别是第一个补丁都不是最新的。我听说有些补丁做得不好,或者需要用更新的补丁替换。然而,我对Imagick以及它如何使用Imagemagick的补丁版本知之甚少。