![]() |
登录 用户中心() [退出] 后台管理 注册 |
热门搜索: |
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: [gd库]gdImageCopyResized 的效果实现太差 |
标题 | [gd库]gdImageCopyResized 的效果实现太差 |
clq |
浏览(2749)
2008-01-19 22:10:57 发表
编辑
关键字: [gd库]gdImageCopyResized 的效果实现太差 换 gdImageCopyResampled 要好得多。 //为了效率要用 gdFree 释放返回值 char * resize_image(const std::string fn, int new_W, int new_H, int & size) { FILE * old_fp = NULL; FILE * new_fp = NULL; gdImagePtr old_im, new_im; //图片旧、新图片句柄 char * old_fn = (char *)fn.c_str();//"C:\\Documents and Settings\\Administrator\\桌面\\1.jpg"; //char * old_fn = "C:\\Documents and Settings\\wilson\\桌面\\1.jpg"; //char * new_fn = "C:\\Documents and Settings\\Administrator\\桌面\\2.jpg"; //int A4_W = new_W;//40;//? //int A4_H = new_H;//40;//? //int new_W = 100;//新宽度 //int new_H = 100;//新高度 char * data = NULL; log_cur(log_file); //缩放//能否保存在内存中 if((old_fp=fopen(old_fn, "rb"))!=NULL) { //打开原图片文件 log_cur(log_file); old_im=gdImageCreateFromJpeg(old_fp);//取得原图片句柄 log_cur(log_file); if (old_im == NULL) return NULL; log_cur(log_file); //计算高度//临时 //old_im->sx;//宽度 //old_im->sy;//高度 new_H = new_W * (((double)old_im->sy)/(double)(old_im->sx)); //计算高度//临时 _end; //一定要销毁旧图片,以免内存泄露 fclose(old_fp); //放在后面//gdImageDestroy(old_im); //new_im = gdImageCreate(A4_W,A4_H); //创建新图片,取得句柄 // new_im = gdImageCreate(new_W, new_H); //创建新图片,取得句柄 new_im = gdImageCreateTrueColor(new_W, new_H); //创建新图片,取得句柄 //int white = gdImageColorAllocate(new_im, 255, 255, 255); //白色,做背景色 //int black = gdImageColorAllocate(new_im, 0, 0, 0); //黑色,做前景色 //gdImageCopyResized 的效果大家都说不好 // gdImageCopyResized(new_im,old_im,0,0,0,0,new_W,new_H,old_im->sx,old_im->sy);//复制并缩放图片,new_W,new_H,新图片的宽高 gdImageCopyResampled(new_im,old_im,0,0,0,0,new_W,new_H,old_im->sx,old_im->sy);//复制并缩放图片,new_W,new_H,新图片的宽高 /* if((new_fp=fopen(new_fn,"wb"))!=NULL) { //打开新文件 gdImageJpeg(new_im,new_fp,-1); //输出图片到文件 fclose(new_fp); }; fclose(old_fp); */ //data = (char *) gdImagePngPtr(new_im, &size); data = (char *) gdImageJpegPtr(new_im, &size, -1);//最后一个参数是什么意思? if (!data) { //Error return NULL; } }; log_cur(log_file); //一定要销毁旧图片,以免内存泄露 //fclose(old_fp); //放在后面// gdImageDestroy(old_im); gdImageDestroy(new_im);//这个会不会导致 data 失效呢? return data; //注意外层函数一定要调用这个//gdFree(data); } |
Copyright © 2005-2012 CLQ工作室, All Rights Reserved CLQ工作室 版权所有 |