📄 gd.c
字号:
{ zval **IM, **save; gdImagePtr im; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &IM, &save) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); convert_to_boolean_ex(save); gdImageSaveAlpha(im, Z_LVAL_PP(save)); RETURN_TRUE;}#endif#if HAVE_GD_BUNDLED/* {{{ proto bool imagelayereffect(resource im, int effect) Set the alpha blending flag to use the bundled libgd layering effects */PHP_FUNCTION(imagelayereffect){ zval **IM, **effect; gdImagePtr im; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &IM, &effect) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); convert_to_long_ex(effect); gdImageAlphaBlending(im, Z_LVAL_PP(effect) ); RETURN_TRUE;}/* }}} */#endif/* {{{ proto int imagecolorallocatealpha(resource im, int red, int green, int blue, int alpha) Allocate a color with an alpha level. Works for true color and palette based images */PHP_FUNCTION(imagecolorallocatealpha){ zval *IM; long red, green, blue, alpha; gdImagePtr im; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zllll", &IM, &red, &green, &blue, &alpha) == FAILURE) { RETURN_FALSE; } ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorAllocateAlpha(im, red, green, blue, alpha));}/* }}} *//* {{{ proto int imagecolorresolvealpha(resource im, int red, int green, int blue, int alpha) Resolve/Allocate a colour with an alpha level. Works for true colour and palette based images */PHP_FUNCTION(imagecolorresolvealpha){ zval **IM, ** red, **green, **blue, **alpha; gdImagePtr im; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &IM, &red, &green, &blue, &alpha) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); convert_to_long_ex(red); convert_to_long_ex(green); convert_to_long_ex(blue); convert_to_long_ex(alpha); RETURN_LONG(gdImageColorResolveAlpha(im, Z_LVAL_PP(red), Z_LVAL_PP(green), Z_LVAL_PP(blue), Z_LVAL_PP(alpha)));}/* }}} *//* {{{ proto int imagecolorclosestalpha(resource im, int red, int green, int blue, int alpha) Find the closest matching colour with alpha transparency */PHP_FUNCTION(imagecolorclosestalpha){ zval **IM, ** red, **green, **blue, **alpha; gdImagePtr im; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &IM, &red, &green, &blue, &alpha) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); convert_to_long_ex(red); convert_to_long_ex(green); convert_to_long_ex(blue); convert_to_long_ex(alpha); RETURN_LONG(gdImageColorClosestAlpha(im, Z_LVAL_PP(red), Z_LVAL_PP(green), Z_LVAL_PP(blue), Z_LVAL_PP(alpha)));}/* }}} *//* {{{ proto int imagecolorexactalpha(resource im, int red, int green, int blue, int alpha) Find exact match for colour with transparency */PHP_FUNCTION(imagecolorexactalpha){ zval **IM, **red, **green, **blue, **alpha; gdImagePtr im; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &IM, &red, &green, &blue, &alpha) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); convert_to_long_ex(red); convert_to_long_ex(green); convert_to_long_ex(blue); convert_to_long_ex(alpha); RETURN_LONG(gdImageColorExactAlpha(im, Z_LVAL_PP(red), Z_LVAL_PP(green), Z_LVAL_PP(blue), Z_LVAL_PP(alpha)));}/* }}} *//* {{{ proto bool imagecopyresampled(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h) Copy and resize part of an image using resampling to help ensure clarity */PHP_FUNCTION(imagecopyresampled){ zval **SIM, **DIM, **SX, **SY, **SW, **SH, **DX, **DY, **DW, **DH; gdImagePtr im_dst, im_src; int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX; if (ZEND_NUM_ARGS() != 10 || zend_get_parameters_ex(10, &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); convert_to_long_ex(SX); convert_to_long_ex(SY); convert_to_long_ex(SW); convert_to_long_ex(SH); convert_to_long_ex(DX); convert_to_long_ex(DY); convert_to_long_ex(DW); convert_to_long_ex(DH); srcX = Z_LVAL_PP(SX); srcY = Z_LVAL_PP(SY); srcH = Z_LVAL_PP(SH); srcW = Z_LVAL_PP(SW); dstX = Z_LVAL_PP(DX); dstY = Z_LVAL_PP(DY); dstH = Z_LVAL_PP(DH); dstW = Z_LVAL_PP(DW); gdImageCopyResampled(im_dst, im_src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH); RETURN_TRUE;}/* }}} */#endif#ifdef HAVE_GD_BUNDLED/* {{{ proto resource imagerotate(resource src_im, float angle, int bgdcolor) Rotate an image using a custom angle */PHP_FUNCTION(imagerotate){ zval **SIM, **ANGLE, **BGDCOLOR; gdImagePtr im_dst, im_src; double degrees; long color; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &SIM, &ANGLE, &BGDCOLOR) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); convert_to_long_ex(BGDCOLOR); color = Z_LVAL_PP(BGDCOLOR); convert_to_double_ex(ANGLE); degrees = Z_DVAL_PP(ANGLE); im_dst = gdImageRotate(im_src, degrees, color); if (im_dst != NULL) { ZEND_REGISTER_RESOURCE(return_value, im_dst, le_gd); } else { RETURN_FALSE; }}/* }}} */#endif#if HAVE_GD_IMAGESETTILE/* {{{ proto bool imagesettile(resource image, resource tile) Set the tile image to $tile when filling $image with the "IMG_COLOR_TILED" color */PHP_FUNCTION(imagesettile){ zval **IM, **TILE; gdImagePtr im, tile; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &IM, &TILE) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); ZEND_FETCH_RESOURCE(tile, gdImagePtr, TILE, -1, "Image", le_gd); gdImageSetTile(im, tile); RETURN_TRUE;}/* }}} */#endif#if HAVE_GD_IMAGESETBRUSH/* {{{ proto bool imagesetbrush(resource image, resource brush) Set the brush image to $brush when filling $image with the "IMG_COLOR_BRUSHED" color */PHP_FUNCTION(imagesetbrush){ zval **IM, **TILE; gdImagePtr im, tile; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &IM, &TILE) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); ZEND_FETCH_RESOURCE(tile, gdImagePtr, TILE, -1, "Image", le_gd); gdImageSetBrush(im, tile); RETURN_TRUE;}/* }}} */#endif/* {{{ proto resource imagecreate(int x_size, int y_size) Create a new image */PHP_FUNCTION(imagecreate){ zval **x_size, **y_size; gdImagePtr im; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &x_size, &y_size) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } convert_to_long_ex(x_size); convert_to_long_ex(y_size); if (Z_LVAL_PP(x_size) <= 0 || Z_LVAL_PP(y_size) <= 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid image dimensions"); RETURN_FALSE; } im = gdImageCreate(Z_LVAL_PP(x_size), Z_LVAL_PP(y_size)); ZEND_REGISTER_RESOURCE(return_value, im, le_gd);}/* }}} *//* {{{ proto int imagetypes(void) Return the types of images supported in a bitfield - 1=GIF, 2=JPEG, 4=PNG, 8=WBMP, 16=XPM */PHP_FUNCTION(imagetypes){ int ret=0;#ifdef HAVE_GD_GIF_CREATE ret = 1;#endif#ifdef HAVE_GD_JPG ret |= 2;#endif#ifdef HAVE_GD_PNG ret |= 4;#endif#ifdef HAVE_GD_WBMP ret |= 8;#endif#if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED) ret |= 16;#endif if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } RETURN_LONG(ret);}/* }}} *//* {{{ _php_image_type */static const char php_sig_gd2[3] = {'g', 'd', '2'};static int _php_image_type (char data[8]){#ifdef HAVE_LIBGD15 /* Based on ext/standard/image.c */ if (data == NULL) { return -1; } if (!memcmp(data, php_sig_gd2, 3)) { return PHP_GDIMG_TYPE_GD2; } else if (!memcmp(data, php_sig_jpg, 3)) { return PHP_GDIMG_TYPE_JPG; } else if (!memcmp(data, php_sig_png, 3)) { if (!memcmp(data, php_sig_png, 8)) { return PHP_GDIMG_TYPE_PNG; } } else if (!memcmp(data, php_sig_gif, 3)) { return PHP_GDIMG_TYPE_GIF; }#ifdef HAVE_GD_WBMP else { gdIOCtx *io_ctx; io_ctx = gdNewDynamicCtxEx(8, data, 0); if (io_ctx) { if (getmbi((int(*)(void *)) gdGetC, io_ctx) == 0 && skipheader((int(*)(void *)) gdGetC, io_ctx) == 0 ) {#if HAVE_LIBGD204 io_ctx->gd_free(io_ctx);#else io_ctx->free(io_ctx);#endif return PHP_GDIMG_TYPE_WBM; } else {#if HAVE_LIBGD204 io_ctx->gd_free(io_ctx);#else io_ctx->free(io_ctx);#endif } } }#endif return -1;#endif}/* }}} */#ifdef HAVE_LIBGD15/* {{{ _php_image_create_from_string */gdImagePtr _php_image_create_from_string(zval **data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC){ gdImagePtr im; gdIOCtx *io_ctx; io_ctx = gdNewDynamicCtxEx(Z_STRLEN_PP(data), Z_STRVAL_PP(data), 0); if (!io_ctx) { return NULL; } im = (*ioctx_func_p)(io_ctx); if (!im) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passed data is not in '%s' format", tn); return NULL; }#if HAVE_LIBGD204 io_ctx->gd_free(io_ctx);#else io_ctx->free(io_ctx);#endif return im;}/* }}} *//* {{{ proto resource imagecreatefromstring(string image) Create a new image from the image stream in the string */PHP_FUNCTION(imagecreatefromstring){ zval **data; gdImagePtr im; int imtype; char sig[8]; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &data) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } convert_to_string_ex(data); memcpy(sig, Z_STRVAL_PP(data), 8); imtype = _php_image_type(sig); switch (imtype) { case PHP_GDIMG_TYPE_JPG:#ifdef HAVE_GD_JPG im = _php_image_create_from_string(data, "JPEG", gdImageCreateFromJpegCtx TSRMLS_CC);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "No JPEG support in this PHP build"); RETURN_FALSE;#endif break; case PHP_GDIMG_TYPE_PNG:#ifdef HAVE_GD_PNG im = _php_image_create_from_string(data, "PNG", gdImageCreateFromPngCtx TSRMLS_CC);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "No PNG support in this PHP build"); RETURN_FALSE;#endif break; case PHP_GDIMG_TYPE_GIF:#ifdef HAVE_GD_GIF_READ im = _php_image_create_from_string(data, "GIF", gdImageCreateFromGifCtx TSRMLS_CC);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "No GIF support in this PHP build"); RETURN_FALSE;#endif break; case PHP_GDIMG_TYPE_WBM:#ifdef HAVE_GD_WBMP im = _php_image_create_from_string(data, "WBMP", gdImageCreateFromWBMPCtx TSRMLS_CC);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "No WBMP support in this PHP build"); RETURN_FALSE;#endif break; case PHP_GDIMG_TYPE_GD2:#ifdef HAVE_GD_GD2 im = _php_image_create_from_string(data, "GD2", gdImageCreateFromGd2Ctx TSRMLS_CC);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "No GD2 support in this PHP build"); RETURN_FALSE;#endif break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Data is not in a recognized format."); RETURN_FALSE; } if (!im) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't create GD Image Stream out of Data"); RETURN_FALSE; } ZEND_REGISTER_RESOURCE(return_value, im, le_gd);}/* }}} */#endif/* {{{ _php_image_create_from */static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()){ zval **file, **srcx, **srcy, **width, **height; gdImagePtr im = NULL; char *fn=NULL; php_stream *stream; FILE * fp = NULL; int argc=ZEND_NUM_ARGS(); if ((image_type == PHP_GDIMG_TYPE_GD2PART && argc != 5) || (image_type != PHP_GDIMG_TYPE_GD2PART && argc != 1) || zend_get_parameters_ex(argc, &file, &srcx, &srcy, &width, &height) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } convert_to_string_ex(file); if (argc == 5 && image_type == PHP_GDIMG_TYPE_GD2PART) { multi_convert_to_long_ex(4, srcx, srcy, width, height); } fn = Z_STRVAL_PP(file); stream = php_stream_open_wrapper(fn, "rb", ENFORCE_SAFE_MODE|REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL); if (stream == NULL) { RETURN_FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -