Проблема с отображением измененных изображений PNG в приложении MFC - PullRequest
0 голосов
/ 06 марта 2019

в нашем приложении MFC мы используем много изображений (jpg и png). Когда мы запускаем приложение, мы загружаем все изображения на карту. всякий раз, когда мы изменяем размеры приложения, мы изменяем размеры всех изображений на карте. мы используем около 300 изображений, поэтому для изменения размера приложения требуется 3 сек. мы попытались разделить изображения на разные карты в зависимости от требований, но это также влияет на производительность. управление также становится туфом.

Наряду с этим возникает еще одна проблема качества при изменении размера изображений .png. После изменения размеров все прозрачные области становятся размытыми.

В нашем коде мы используем класс CxImage для загрузки, рендеринга и изменения размера изображения.

Ниже приведен пример кода. Пожалуйста, предложите, как решить такие проблемы. мы можем использовать файлы SVG в приложении MFC?

Загрузка изображения

    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;
    }
...