我的目标是为专有图像格式创建一个PHP扩展,并让它创建一个与gd兼容的图像资源,可以与gd PHP扩展函数一起使用。
现在,浏览gd源代码,我遇到了他们的gdImagePtr
指针的struct / typedef - 它似乎是扩展包装的内容,如前面提到的"图像资源"。结构本身完全由标准C类型组成,所以这让我想问......
如果我在扩展程序中使用相同的结构,请使用此图像格式中的相应数据填充它,并以相同的方式将其提供给PHP,这样可行吗?或者这个图像资源更像是一个句柄,并且必须在gd中创建它才能工作?
答案 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函数一起使用。