在我们的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;
}