与gd php扩展的交互

时间:2014-05-20 00:36:34

标签: c gd php-extension

我的目标是为专有图像格式创建一个PHP扩展,并让它创建一个与gd兼容的图像资源,可以与gd PHP扩展函数一起使用。

现在,浏览gd源代码,我遇到了他们的gdImagePtr指针的struct / typedef - 它似乎是扩展包装的内容,如前面提到的"图像资源"。结构本身完全由标准C类型组成,所以这让我想问......

如果我在扩展程序中使用相同的结构,请使用此图像格式中的相应数据填充它,并以相同的方式将其提供给PHP,这样可行吗?或者这个图像资源更像是一个句柄,并且必须在gd中创建它才能工作?

1 个答案:

答案 0 :(得分:1)

答案是肯定的,还有一小步。

我的第一个测试是直接与gd直接交互 - 果然,只要结构被正确填充,gd非常乐意使用第三方gdImagePtr用于其他用途。在我的测试中,我只是创建了一个带有图片框的表单,并使用.NET的非托管内存流与gdImagePngPtr相结合,将其填充为gdImagePtr,并且它运行良好。

当然,下一步是用PHP做到这一点,但由于有一个中间人 - 即ZEND_RESOURCE,这个gdImagePtr变成了,所以还有一个额外的步骤。 ZEND为每个扩展提供了自己独特的ID - 因此使用该结构创建自己的资源是行不通的。但是,gd扩展提供了自己的API - 只有一个函数。

因此,如果您加入php_gd.h,则可以执行以下操作:

ZEND_REGISTER_RESOURCE(return_value, im, phpi_get_le_gd());

module_number替换标准phpi_get_le_gd()(您的扩展名的ID)将使该资源“属于”gd扩展名,允许您将图像资源与PHP中的其他gd函数一起使用。