Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
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);
}
Пример #6
0
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;
}
Пример #8
0
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;
}
Пример #9
0
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;
}
Пример #10
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;
}
Пример #11
0
static void * gdImageGifPtrWrap(gdImagePtr image, int *size, int quality) {
  return gdImageGifPtr(image, size);
}