用C语言怎么把bmp格式的图片放大,因为在做图片识别需要放大截取的放大为统一大小。

用C语言怎么把bmp格式的图片放大,因为在做图片识别需要放大截取的放大为统一大小。,第1张

原型:

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%,查表后得出数值,确实也能计算,但不会很准


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12088964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存