vc 实现图片的像素大小改变 vc实现 图片的大小改变 如800×600 改成 600×400请各位高手帮忙,最好有代码参考,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对图像的操作还是找专门的类库为好,比如ximage,freeimage;方便、可靠、高效、而且有源代码; 补充一下,是保存时像素大小改变,而不是显示大小改变,Cimage不提供这个功能吧 http://topic.csdn.net/u/20070813/16/366c3a9c-c5fe-497b-a693-6c46bea37079.html 补充一下,是保存时像素大小改变?是不是24位图像变8位?设置位深度?CxImage是可以的 用GDI+转化,注意项目中要导入GDI+库#include <gdiPlus.h>using namespace Gdiplus;#pragma comment(lib, "gdiplus.lib")使用前要初始化GDI+环境GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);推出时关闭资源GdiplusShutdown(gdiplusToken);int TransPicture(LPCWSTR lpSrcFile,LPCWSTR lpDstExt,CStringW &strDstFile) { USES_CONVERSION; CFileFind find; #ifdef UNICODE if (!find.FindFile(lpSrcFile))//文件不存在 #else if (!find.FindFile(W2A(lpSrcFile)))//文件不存在 #endif { find.Close(); return 0; } find.Close(); Image *psrcImg=NULL; psrcImg = Image::FromFile(lpSrcFile); if (!psrcImg || psrcImg->GetLastStatus() != Ok) { return 0; } int srcWidth=psrcImg->GetWidth(); int srcHeight=psrcImg->GetHeight(); // Construct a Graphics object based on the image. //Graphics imgGraphics(psrcImg); int nSaveWidth=57; int nSaveHeight = 57; Bitmap *pBitmap = ::new Bitmap(nSaveWidth,nSaveHeight); Graphics bmpGraphics(pBitmap); //bmpGraphics.DrawImage(psrcImg,0,0,srcWidth,srcHeight); bmpGraphics.DrawImage(psrcImg,RectF(0,0,nSaveWidth,nSaveHeight),0,0,srcWidth,srcHeight,UnitPixel); delete psrcImg; bmpGraphics.ReleaseHDC(NULL); // Save the altered image. LPWSTR lpExt=PathFindExtensionW(lpSrcFile); LPWSTR lpExtDst = NULL; lpDstExt++; LPWSTR lpEncoder; switch(*lpDstExt) { case L'J': case L'j': lpEncoder=L"image/jpeg"; lpExtDst = L".jpeg"; break; case L'P': case L'p': lpEncoder=L"image/png"; lpExtDst = L".png"; break; case L'B': case L'b': lpEncoder=L"image/bmp"; lpExtDst = L".bmp"; break; case L'G': case L'g': lpEncoder=L"image/gif"; lpExtDst = L".gif"; break; case L't': case L'T': lpEncoder=L"image/tiff"; lpExtDst = L".tiff"; break; default: lpEncoder=L"image/jpeg"; lpExtDst = L".jpeg"; } CStringW strPicPath(lpSrcFile); CStringW strExt(lpExt); int nLen = strPicPath.Find(strExt); if(nLen>0) strPicPath=strPicPath.Left(nLen); strPicPath += lpExtDst; CLSID imgClsid; GetImageCLSID(lpEncoder,&imgClsid); Status statusSave = pBitmap->Save(strPicPath,&imgClsid,NULL); DeleteFileW(lpSrcFile); //lpSrcFile = strPicPath.GetBuffer(); //strPicPath.ReleaseBuffer(); strDstFile = CStringW(strPicPath); ::delete pBitmap; return (statusSave == Ok )?1:0;}BOOL GetImageCLSID(const WCHAR* format, CLSID* pCLSID){ UINT num = 0; UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0){ return FALSE; } pImageCodecInfo = (ImageCodecInfo *)(malloc(size)); if(pImageCodecInfo == NULL) return FALSE; GetImageEncoders(num, size, pImageCodecInfo); // Find for the support of format for image in the windows for(UINT i = 0; i < num; ++i) { //MimeType: Depiction for the program image if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0) { *pCLSID = pImageCodecInfo[i].Clsid; free(pImageCodecInfo); return TRUE; } } free(pImageCodecInfo); return FALSE; } 先resize到另外一个图像,然后再保存不就行了 双线插值缩放算法SOSO一下 如何通过插件方式取到office模板文件的全路径??? 求教调色板的问题 怎样计算一个时间段内所包含的自然周数? 请教SDK下怎么显示进度条? 在请教一个CLISTCTRL类的问题? 《数据结构》(C语言版)——清华大学出版,哪位兄弟知道这本书的下载地址? variant 变量的传递问题。 寻VC++高手合作!!! WTL CFileDialog 问题 大家来看看 如果制作出一个有"透明色"的小图片? 一个从C#转VC的问题 wininet API怎么设置代理???
方便、可靠、高效、而且有源代码;
#include <gdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")使用前要初始化GDI+环境
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
推出时关闭资源
GdiplusShutdown(gdiplusToken);int TransPicture(LPCWSTR lpSrcFile,LPCWSTR lpDstExt,CStringW &strDstFile)
{
USES_CONVERSION;
CFileFind find;
#ifdef UNICODE
if (!find.FindFile(lpSrcFile))//文件不存在
#else
if (!find.FindFile(W2A(lpSrcFile)))//文件不存在
#endif {
find.Close();
return 0;
}
find.Close(); Image *psrcImg=NULL;
psrcImg = Image::FromFile(lpSrcFile);
if (!psrcImg || psrcImg->GetLastStatus() != Ok)
{
return 0;
}
int srcWidth=psrcImg->GetWidth();
int srcHeight=psrcImg->GetHeight(); // Construct a Graphics object based on the image.
//Graphics imgGraphics(psrcImg);
int nSaveWidth=57;
int nSaveHeight = 57;
Bitmap *pBitmap = ::new Bitmap(nSaveWidth,nSaveHeight);
Graphics bmpGraphics(pBitmap);
//bmpGraphics.DrawImage(psrcImg,0,0,srcWidth,srcHeight);
bmpGraphics.DrawImage(psrcImg,RectF(0,0,nSaveWidth,nSaveHeight),0,0,srcWidth,srcHeight,UnitPixel);
delete psrcImg;
bmpGraphics.ReleaseHDC(NULL); // Save the altered image.
LPWSTR lpExt=PathFindExtensionW(lpSrcFile);
LPWSTR lpExtDst = NULL; lpDstExt++; LPWSTR lpEncoder;
switch(*lpDstExt)
{
case L'J':
case L'j':
lpEncoder=L"image/jpeg";
lpExtDst = L".jpeg";
break;
case L'P':
case L'p':
lpEncoder=L"image/png";
lpExtDst = L".png";
break;
case L'B':
case L'b':
lpEncoder=L"image/bmp";
lpExtDst = L".bmp";
break;
case L'G':
case L'g':
lpEncoder=L"image/gif";
lpExtDst = L".gif";
break;
case L't':
case L'T':
lpEncoder=L"image/tiff";
lpExtDst = L".tiff";
break;
default:
lpEncoder=L"image/jpeg";
lpExtDst = L".jpeg";
} CStringW strPicPath(lpSrcFile);
CStringW strExt(lpExt);
int nLen = strPicPath.Find(strExt);
if(nLen>0)
strPicPath=strPicPath.Left(nLen);
strPicPath += lpExtDst; CLSID imgClsid;
GetImageCLSID(lpEncoder,&imgClsid);
Status statusSave = pBitmap->Save(strPicPath,&imgClsid,NULL); DeleteFileW(lpSrcFile); //lpSrcFile = strPicPath.GetBuffer();
//strPicPath.ReleaseBuffer();
strDstFile = CStringW(strPicPath);
::delete pBitmap; return (statusSave == Ok )?1:0;
}BOOL GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{
UINT num = 0;
UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0){
return FALSE;
}
pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE;
GetImageEncoders(num, size, pImageCodecInfo); // Find for the support of format for image in the windows
for(UINT i = 0; i < num; ++i)
{
//MimeType: Depiction for the program image
if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
{
*pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
先resize到另外一个图像,然后再保存不就行了
SOSO一下