static void *resizeImage( const char *buf, int bufLen, int width, int height, MyData *myData, int *size ) { char *ptr; gdImagePtr dest, src; if ( myData->IMAGE_TYPE == HTTP_IMG_JPEG ) src = gdImageCreateFromJpegPtr( bufLen, (void *)buf ); else if ( myData->IMAGE_TYPE == HTTP_IMG_GIF ) src = gdImageCreateFromGifPtr( bufLen, (void *)buf ); else if ( myData->IMAGE_TYPE == HTTP_IMG_PNG ) src = gdImageCreateFromPngPtr( bufLen, (void *)buf ); else return NULL; if ( !width && !height ) return NULL; else if ( !width ) width = height * src->sx / src->sy; else if ( !height ) height = width * src->sy / src->sx; dest = gdImageCreateTrueColor( width, height ); gdImageCopyResampled( dest, src, 0, 0, 0, 0, width, height, src->sx, src->sy ); if ( myData->IMAGE_TYPE == HTTP_IMG_JPEG ) ptr = gdImageJpegPtr( dest, size, 50 ); else if ( myData->IMAGE_TYPE == HTTP_IMG_GIF ) ptr = gdImageGifPtr( dest, size ); else if ( myData->IMAGE_TYPE == HTTP_IMG_PNG ) ptr = gdImagePngPtr( dest, size ); return ptr; }
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; }
value ImageGifData(value img) { ImageData _img = getImage(img); int size; void *ptr = gdImageGifPtr(imageImage(_img),&size); buffer ret = alloc_buffer(NULL); buffer_append_sub(ret,ptr,size); gdFree(ptr); return buffer_to_string(ret); }
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; }
static void thumb_to_string(void *conf) { ngx_image_conf_t *info = conf; switch(info->dest_type) { case NGX_IMAGE_PNG: info->img_data = gdImagePngPtr(info->dst_im,&info->img_size); break; case NGX_IMAGE_GIF: info->img_data = gdImageGifPtr(info->dst_im,&info->img_size); break; case NGX_IMAGE_JPEG: info->img_data = gdImageJpegPtr(info->dst_im,&info->img_size,info->jpeg_quality); break; } gdImageDestroy(info->dst_im); }
void plD_eop_gif(PLStream *pls) { png_Dev *dev=(png_Dev *)pls->dev; int im_size=0; void *im_ptr=NULL; if (pls->family || pls->page == 1) { /* image is written to output file by the driver since if the gd.dll is linked to a different c lib a crash occurs - this fix works also in Linux */ /* gdImageGif(dev->im_out, pls->OutFile); */ im_ptr = gdImageGifPtr(dev->im_out, &im_size); if( im_ptr ) { fwrite(im_ptr, sizeof(char), im_size, pls->OutFile); gdFree(im_ptr); } gdImageDestroy(dev->im_out); dev->im_out = NULL; } }
static u_char *ngx_http_small_light_gd_out(gdImagePtr img, ngx_int_t type, int *size, double q) { u_char *out = NULL; switch (type) { case NGX_HTTP_SMALL_LIGHT_IMAGE_JPEG: out = gdImageJpegPtr(img, size, (int)q); break; case NGX_HTTP_SMALL_LIGHT_IMAGE_GIF: out = gdImageGifPtr(img, size); break; case NGX_HTTP_SMALL_LIGHT_IMAGE_PNG: out = gdImagePngPtr(img, size); break; case NGX_HTTP_SMALL_LIGHT_IMAGE_WEBP: #ifdef NGX_HTTP_SMALL_LIGHT_GD_WEBP_ENABLED out = gdImageWebpPtrEx(img, size, (int)q); #endif break; default: break; } return out; }
int main() { gdImagePtr src, dst; int r, g, b; void *p; int size = 0; int status = 0; CuTestImageResult result = {0, 0}; src = gdImageCreate(100, 100); if (src == NULL) { printf("could not create src\n"); return 1; } r = gdImageColorAllocate(src, 0xFF, 0, 0); g = gdImageColorAllocate(src, 0, 0xFF, 0); b = gdImageColorAllocate(src, 0, 0, 0xFF); gdImageFilledRectangle(src, 0, 0, 99, 99, r); gdImageRectangle(src, 20, 20, 79, 79, g); gdImageEllipse(src, 70, 25, 30, 20, b); #define OUTPUT_GIF(name) do { \ FILE *fp; \ \ fp = fopen("gif_im2im_" #name ".gif", "wb"); \ if (fp) { \ gdImageGif(name, fp); \ fclose(fp); \ } \ } while (0) OUTPUT_GIF(src); p = gdImageGifPtr(src, &size); if (p == NULL) { status = 1; printf("p is null\n"); goto door0; } if (size <= 0) { status = 1; printf("size is non-positive\n"); goto door1; } dst = gdImageCreateFromGifPtr(size, p); if (dst == NULL) { status = 1; printf("could not create dst\n"); goto door1; } OUTPUT_GIF(dst); gdTestImageDiff(src, dst, NULL, &result); if (result.pixels_changed > 0) { status = 1; printf("pixels changed: %d\n", result.pixels_changed); } gdImageDestroy(dst); door1: gdFree(p); door0: gdImageDestroy(src); return status; }
static int szm_do_scale_head_photo_internal(gdImagePtr im_in, char **out, int *out_len, int in_len) { gdImagePtr im_out; int x, y, y_offset=0, y_n, new_x, new_y, resize=0; x = gdImageSX(im_in); y = gdImageSY(im_in); if ( x <0 ||y<0 ||x > MAX_PHOTO_SCALE || y > MAX_PHOTO_SCALE){ gdImageDestroy(im_in); return -SZM_ERR_TOOLARGE; } if (x <= HEAD_PHOTO_WEIGHT && y <= HEAD_PHOTO_HEIGHT){ new_x = x; new_y = y; if(in_len <= HEAD_PHOTO_SIZE){ gdImageDestroy(im_in); return -SZM_ERR_NONEED; } } else if ( x <= HEAD_PHOTO_WEIGHT){ new_x = x; new_y = HEAD_PHOTO_HEIGHT; y_offset = (y - HEAD_PHOTO_HEIGHT) / 2; } else { resize = 1; new_x = HEAD_PHOTO_WEIGHT; y_n = HEAD_PHOTO_HEIGHT * x / HEAD_PHOTO_WEIGHT; if(y_n >= y){ y_n = y; new_y = HEAD_PHOTO_WEIGHT * y / x; if(!new_y) new_y=1; } else { y_offset = (y - y_n) / 2; new_y = HEAD_PHOTO_HEIGHT; } } im_out = gdImageCreateTrueColor(new_x, new_y); if (!im_out) { gdImageDestroy(im_in); return -SZM_ERR_IMGPROC; } if(resize) gdImageCopyResampled(im_out, im_in, 0, 0, 0, y_offset, im_out->sx, im_out->sy, im_in->sx, y_n); else gdImageCopy(im_out, im_in, 0, 0, 0, y_offset, im_out->sx, im_out->sy); *out = gdImageGifPtr(im_out, out_len); if(*out_len>HEAD_PHOTO_SIZE){ x=1; y=100; while(x+1<y){ gdFree(*out); *out = gdImageJpegPtr(im_out, out_len, (x+y)/2); if(*out_len>HEAD_PHOTO_SIZE) y=(x+y)/2; else x=(x+y)/2; } } gdImageDestroy(im_in); gdImageDestroy(im_out); return 0; }
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; }
static void * gdImageGifPtrWrap(gdImagePtr image, int *size, int quality) { return gdImageGifPtr(image, size); }