int WINAPI icePub_imgZoom(char *strImgFilename,char *strBmpFilename,int newWidth,int newHeight,int flag)
输入:strImgFilename 待处理图像文件名
strBmpFilename 结果bmp文件名
newWidth 新图宽
newHeight 新图高
flag 0 等比缩放1 完全缩放
输出:
typedef int (WINAPI ICEPUB_IMGZOOM)(char *strImgFilename,char *strBmpFilename,int newWidth,int newHeight,int flag)
ICEPUB_IMGZOOM *icePub_imgZoom = 0
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll")
if(hDLLDrv)
{
icePub_imgZoom=(ICEPUB_IMGZOOM *)GetProcAddress(hDLLDrv,"icePub_imgZoom")
}
if(icePub_imgZoom)
{
icePub_imgZoom("a.jpg","a1.bmp",100,100,0)
icePub_imgZoom("d.png", "d1.bmp",50.80,1)
}
if(hDLLDrv)
FreeLibrary(hDLLDrv)
用StretchBlt函数即可实现,参考代码如下:
void CImgWnd::OnPaint(){
CPaintDC dc(this) // device context for painting
//获得窗口大小
CRect r
GetClientRect(&r)
//填充背景
HBRUSH brush = (HBRUSH)::GetStockObject(GRAY_BRUSH)
::FillRect(dc.m_hDC,&r,brush)
dc.SetStretchBltMode(HALFTONE)
//将位图选进设备场景中
CDC memdc
memdc.CreateCompatibleDC( &dc )
CBitmap* pOldBmp= memdc.SelectObject(&m_bmpImage)
//获得位图参数
BITMAP bmp
m_bmpImage.GetBitmap(&bmp)
//开始缩放
switch(m_nStrechType)
{
case STRECH_1_1://1:1
dc.BitBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,SRCCOPY)
break
case STRECH_FULL_X://按宽度
dc.StretchBlt(r.left,r.top,r.Width(),bmp.bmHeight,&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY)
break
case STRECH_FULL_Y://按高度
dc.StretchBlt(r.left,r.top,bmp.bmWidth,r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY)
break
case STRECH_FULL://充满窗口
dc.StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY)
break
case STRECH_CENTER://居中显示,大小为窗口的一半
dc.StretchBlt(r.Width()/4,r.Height()/4,r.Width()/2,r.Height()/2,&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY)
break
}
//还原
memdc.SelectObject(pOldBmp)
}
要查表,我手边没有表,而且已经学过很多年了,只随便说个数字,举例说明:先假定r=4%,查表计算出数值=900再假定r=5%,查表计算出数值=1100
然后计算(1100-900)/(5%-4%)=(1000-900)/(r-4%)
200(r-4%)=1
r=4.5%
如果你第一次选取是数值是3%,计算出数值=800,第二次选取4%,计算=900,都低于1000,那么就要继续试5%,6%……直到计算结果一个小于1000,另一个大于1000,而且与1000越接近,差值法计算出r越准确,如果选项一个1%,一个20%,查表后得出数值,确实也能计算,但不会很准
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)