【求助】关于图像缩放问题 本帖最后由 didilc 于 2013-09-11 17:06:23 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 双线性插值图像放大/缩小算法 http://wenku.baidu.com/view/ea2c6fcf0508763231121299.html //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //放大或者缩小RGB24,采用双线性插值算法 ////////////////////////////////////////////////////////////////////////// void ZoomBitMap(unsigned char *pSrcImg, unsigned char *pDstImg, int nWidth, int nHeight, float fRateW,float fRateH) { int i = 0; int j = 0; float fX, fY; int iStepSrcImg = nWidth; int iStepDstImg = nWidth * fRateW; int iX, iY; unsigned char bUpLeft, bUpRight, bDownLeft, bDownRight; unsigned char gUpLeft, gUpRight, gDownLeft, gDownRight; unsigned char rUpLeft, rUpRight, rDownLeft, rDownRight; unsigned char b, g, r; int iHightValue = nHeight * fRateH; int iWidthValue = nWidth * fRateW; for(i = 0; i < iHightValue; i++) { fX = ((float)j) /fRateW; fY = ((float)i) /fRateH; for(j = 0; j < iWidthValue; j++) { iX = (int)fX; iY = (int)fY; bUpLeft = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 0]; bUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 0]; bDownLeft = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 0]; bDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 0]; gUpLeft = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 1]; gUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 1]; gDownLeft = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 1]; gDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 1]; rUpLeft = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 2]; rUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 2]; rDownLeft = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 2]; rDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 2]; b = bUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + bUpRight * (fX - iX) * (iY + 1 - fY) + bDownLeft * (iX + 1 - fX) * (fY - iY) + bDownRight * (fX - iX) * (fY - iY); g = gUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + gUpRight * (fX - iX) * (iY + 1 - fY) + gDownLeft * (iX + 1 - fX) * (fY - iY) + gDownRight * (fX - iX) * (fY - iY); r = rUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + rUpRight * (fX - iX) * (iY + 1 - fY) + rDownLeft * (iX + 1 - fX) * (fY - iY) + rDownRight * (fX - iX) * (fY - iY); if(iY >= 0 && iY <= nHeight * 2 && iX >= 0 && iX <= nWidth * 2) { pDstImg[i * iStepDstImg * 3 + j * 3 + 0] = b; //B pDstImg[i * iStepDstImg * 3 + j * 3 + 1] = g; //G pDstImg[i * iStepDstImg * 3 + j * 3 + 2] = r; //R } } } } 费解的::AfxGetApp() 关于界面编程的问题 那位大侠能把GCC中的嵌入式汇编转成VC下的?急!急!!急!!! 用vc++6.0在本机(WINDOWSXP)写的一个FMC程序为什么在另一台windows2000上无法运行? 求<COM技术内幕>附带光盘。 谁能帮我翻译一下下面的这句话!!! 我想写一个程序让以前的小硬盘当内存使用(思路)最好用C,VC++写! vc FileTimeToSystemTime函数的问题 弱智问题,高分求救!! 大给分--与html com接口有关 wsock32.dll替换,怎么修改buf里的内容? 使用CButotonst类填充按钮背景色问题
//////////////////////////////////////////////////////////////////////////
//放大或者缩小RGB24,采用双线性插值算法
//////////////////////////////////////////////////////////////////////////
void ZoomBitMap(unsigned char *pSrcImg, unsigned char *pDstImg, int nWidth, int nHeight, float fRateW,float fRateH)
{
int i = 0;
int j = 0; float fX, fY; int iStepSrcImg = nWidth;
int iStepDstImg = nWidth * fRateW; int iX, iY; unsigned char bUpLeft, bUpRight, bDownLeft, bDownRight;
unsigned char gUpLeft, gUpRight, gDownLeft, gDownRight;
unsigned char rUpLeft, rUpRight, rDownLeft, rDownRight; unsigned char b, g, r; int iHightValue = nHeight * fRateH;
int iWidthValue = nWidth * fRateW; for(i = 0; i < iHightValue; i++)
{
fX = ((float)j) /fRateW;
fY = ((float)i) /fRateH; for(j = 0; j < iWidthValue; j++)
{
iX = (int)fX;
iY = (int)fY; bUpLeft = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 0];
bUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 0]; bDownLeft = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 0];
bDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 0]; gUpLeft = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 1];
gUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 1]; gDownLeft = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 1];
gDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 1]; rUpLeft = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 2];
rUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 2]; rDownLeft = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 2];
rDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 2]; b = bUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + bUpRight * (fX - iX) * (iY + 1 - fY)
+ bDownLeft * (iX + 1 - fX) * (fY - iY) + bDownRight * (fX - iX) * (fY - iY); g = gUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + gUpRight * (fX - iX) * (iY + 1 - fY)
+ gDownLeft * (iX + 1 - fX) * (fY - iY) + gDownRight * (fX - iX) * (fY - iY); r = rUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + rUpRight * (fX - iX) * (iY + 1 - fY)
+ rDownLeft * (iX + 1 - fX) * (fY - iY) + rDownRight * (fX - iX) * (fY - iY); if(iY >= 0 && iY <= nHeight * 2 && iX >= 0 && iX <= nWidth * 2)
{
pDstImg[i * iStepDstImg * 3 + j * 3 + 0] = b; //B
pDstImg[i * iStepDstImg * 3 + j * 3 + 1] = g; //G
pDstImg[i * iStepDstImg * 3 + j * 3 + 2] = r; //R
}
}
}
}