首页 > 解决方案 > 在 MFC 应用程序中调整大小的 PNG 图像的显示问题

问题描述

在我们的 MFC 应用程序中,我们使用了大量的图像(jpg 和 png)。当我们启动应用程序时,我们正在将所有图像加载到地图中。每当我们调整应用程序的大小时,我们都会调整地图中所有图像的大小。我们使用了近 300 张图像,因此需要 3 秒来调整应用程序的大小。我们尝试根据需求将图像拆分为不同的地图,但这也会影响性能。管理也变得一团糟。

除此之外,当我们调整 .png 图像的大小时,还有一个质量问题。调整大小后,所有透明区域都变得模糊。

在我们的代码中,我们使用 CxImage 类来加载、渲染和调整图像大小。

下面是代码示例。请建议如何处理此类问题。我们可以在 MFC 应用程序中使用 SVG 文件吗?

加载图像

    int CPicture::Load(CString sFileName)
    {
        CString strFullFileName = sFileName;
        CString strOrigFileName = strFullFileName;
        int nRet = strFullFileName.ReverseFind('.');
        if(nRet != -1)
        {
            strFullFileName.Insert(nRet, _T("_bl"));
        }

        if( FALSE == CheckIfFileExists(strFullFileName) )
        {
            strFullFileName = strOrigFileName;
        }
    }

    CString ss = sFileName;
    ss.MakeLower();

    if(ss.Find(_T(".png")) > 0)
    {
        // forcefully loading new images 
        if(m_pXImage)
        {
            SAFE_DELETE(m_pXImage);
        }
        if(NULL == m_pXImage)
        {
            m_pXImage = new CxImage(strFullFileName, CXIMAGE_FORMAT_PNG);
        }
        if (!m_pXImage->IsValid()){
            SAFE_DELETE(m_pXImage);
            //AfxMessageBox(m_pXImage->GetLastError());
            return E_IMAGEFILE_NOTLOADED;
        }
        msName = strFullFileName;
        return E_IMAGEFILE_LOADED;
    }

    if(ss.Find(_T(".gif")) > 0)
    {
        // forcefully loading new images 
        if(m_pXImage)
        {
            SAFE_DELETE(m_pXImage);
        }
        if(NULL == m_pXImage)
        {
            m_pXImage = new CxImage(strFullFileName, CXIMAGE_FORMAT_GIF);
        }
        if (!m_pXImage->IsValid()){
            SAFE_DELETE(m_pXImage);
            //AfxMessageBox(m_pXImage->GetLastError());
            return E_IMAGEFILE_NOTLOADED;
        }
        msName = strFullFileName;
        return E_IMAGEFILE_LOADED;
    }
    int bResult = E_IMAGEFILE_NOTLOADED;
    if (m_pPicture != NULL)
        UnLoad();

    if (m_pPicture == NULL)
    {
        CFile           cFile;
        CFileException  fileException;

        if(!cFile.Open(strFullFileName, CFile::modeRead | CFile::typeBinary, &fileException))
        {
            if(!cFile.Open(strFullFileName, CFile::modeRead | CFile::typeBinary, &fileException))
            {
                return E_IMAGEFILE_MISSING;
            }
        }

        msName = strFullFileName;

        if(cFile.GetLength() <= 0)
        {
            cFile.Close(); 

            return E_IMAGEFILE_MISSING;
        }

        int nSize = static_cast<int> (cFile.GetLength());
        BYTE* pBuff = new BYTE[nSize];

        if (cFile.Read(pBuff, nSize) > 0)
        {
            if(LoadFromBuffer(pBuff, nSize))
            {
                bResult = E_IMAGEFILE_LOADED;
            }
            else
            {
                bResult = E_IMAGEFILE_NOMEMORYTOLOAD;
            }
        }
        else
        {

            bResult = E_IMAGEFILE_MISSING;
        }
        cFile.Close();
        delete [] pBuff;
    }
    return bResult;
}

图像缩放代码

CPicture* CPicture::GetScaledClone(double fRatioX, double fRatioY)
    if(m_pXImage)
    {
        CPicture* pPic = new CPicture();
        pPic->m_nTotalParts = m_nTotalParts;
        pPic->m_pXImage = new CxImage(*m_pXImage);

        CSize size = GetSize();
        long lX = static_cast<LONG>(size.cx*fRatioX);
        long lY = static_cast<LONG>(size.cy*fRatioY);
        if(m_nTotalParts > 1)
        {
            int nX = lX % m_nTotalParts;
            int nY = nX * lY/lX;
            lX -= nX;
            lY -= nY;
        }

        pPic->m_pXImage->Resample(lX, lY, 0);
        return pPic;
    }

标签: mfcpng

解决方案


推荐阅读