int ImageWrite( struct ImageLibrary *im, File *rootDev, gdImagePtr img, const char *path ) { FHandler *fh = rootDev->f_FSys; File *rfp = (File *)fh->FileOpen( rootDev, path, "wb" ); if( rfp != NULL ) { char *buffer = NULL; int length = 0; int psize = strlen( path ); if( psize > 3 ) //we are checking if file have extension { char ext[ 4 ]; strcpy( ext, &(path[ psize-4 ]) ); ext[ 0 ] = toupper( ext[ 0 ] ); ext[ 1 ] = toupper( ext[ 1 ] ); ext[ 2 ] = toupper( ext[ 2 ] ); if( CHECK_EXT( ext, 'P','N','G' ) ) { buffer = gdImagePngPtr( img, &length ); }else if( CHECK_EXT( ext, 'J','P','G' ) ){ buffer = gdImageJpegPtr( img, &length, 100 ); }else if( CHECK_EXT( ext, 'G','I','F' ) ){ buffer = gdImageGifPtr( img, &length ); }else if( CHECK_EXT( ext, 'W','E','B' ) ){ buffer = gdImageWebpPtr( img, &length ); }else if( CHECK_EXT( ext, 'I','I','F' ) ){ buffer = gdImageTiffPtr( img, &length ); }else if( CHECK_EXT( ext, 'B','M','P' ) ){ buffer = gdImageBmpPtr( img, &length, 100 ); } if( buffer == NULL ) { fh->FileClose( rootDev, rfp ); ERROR("Cannot save picture, GD couldnt create buffer from image\n"); return 2; } else { fh->FileWrite( rfp, buffer, length ); } } else { ERROR("Extension name is too short, file format not recognized\n"); } fh->FileClose( rootDev, rfp ); } else { ERROR("Cannot open file: %s to write\n", path ); return 1; } return 0; }
static u_char * ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type, gdImagePtr img, int *size) { char *failed; u_char *out; ngx_int_t jq; ngx_http_image_filter_conf_t *conf; out = NULL; switch (type) { case NGX_HTTP_IMAGE_JPEG: conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); jq = ngx_http_image_filter_get_value(r, conf->jqcv, conf->jpeg_quality); if (jq <= 0) { return NULL; } out = gdImageJpegPtr(img, size, jq); failed = "gdImageJpegPtr() failed"; break; case NGX_HTTP_IMAGE_GIF: out = gdImageGifPtr(img, size); failed = "gdImageGifPtr() failed"; break; case NGX_HTTP_IMAGE_PNG: out = gdImagePngPtr(img, size); failed = "gdImagePngPtr() failed"; break; case NGX_HTTP_IMAGE_BMP: out = gdImageBmpPtr(img, size, -1); failed = "gdImageBmpPtr() failed"; break; default: failed = "unknown image type"; break; } if (out == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed); } return out; }
result_t Image::getData(int32_t format, int32_t quality, obj_ptr<Buffer_base> &retVal, AsyncEvent *ac) { if (!m_image) return CHECK_ERROR(CALL_E_INVALID_CALL); if (!ac) return CHECK_ERROR(CALL_E_NOSYNC); int32_t size = 0; void *data = NULL; int32_t sx = gdImageSX(m_image); int32_t sy = gdImageSY(m_image); int32_t i, j; int32_t trans = -1; if (gdImageTrueColor(m_image)) { for (i = 0; i < sx && trans == -1; i ++) for (j = 0; j < sy && trans == -1; j++) if ((gdImageGetPixel(m_image, i, j) & 0xff000000) != 0) trans = 0; } else trans = gdImageGetTransparent(m_image); gdImagePtr nowImage = m_image; if (trans != -1) { if (format != gd_base::_PNG) { if (gdImageTrueColor(m_image)) nowImage = gdImageCreateTrueColor(sx, sy); else { nowImage = gdImageCreate(sx, sy); gdImagePaletteCopy(nowImage, m_image); } gdImageFilledRectangle(nowImage, 0, 0, sx, sy, gdImageColorAllocate(nowImage, 255, 255, 255)); gdImageCopy(nowImage, m_image, 0, 0, 0, 0, sx, sy); } else if (gdImageTrueColor(m_image)) gdImageSaveAlpha(m_image, 1); } switch (format) { case gd_base::_GIF: data = gdImageGifPtr(nowImage, &size); break; case gd_base::_PNG: data = gdImagePngPtr(nowImage, &size); break; case gd_base::_JPEG: { unsigned char *ed_data = NULL; uint32_t ed_size = 0; data = gdImageJpegPtr(nowImage, &size, quality, ed_data, ed_size); if (ed_data) free(ed_data); break; } case gd_base::_TIFF: data = gdImageTiffPtr(nowImage, &size); break; case gd_base::_BMP: data = gdImageBmpPtr(nowImage, &size, 1); break; case gd_base::_WEBP: data = gdImageWebpPtrEx(nowImage, &size, quality); break; } if (nowImage != m_image) gdImageDestroy(nowImage); if (data == NULL) return CHECK_ERROR(CALL_E_INVALIDARG); retVal = new Buffer(std::string((char *) data, size)); gdFree(data); return 0; }