mfc - 在 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;
}
解决方案
推荐阅读
- python - 我的精灵在 Pygame 中没有正确显示
- java - 如何在 Quarkus 中使用自定义编码器和解码器?
- javascript - 在移动到下一个循环迭代之前等待文件上传?
- java - 将用户推算比较运算符直接带入 if 语句(java)
- react-native - 当互联网关闭时,我需要在每个屏幕上显示警报模式
- d3.js - 带有对数刻度的轴,如何包含 0 的刻度?
- java - Java - 如何对 Java 对象进行 Gzip 压缩
- c# - 通过 Gridview 从 DataSource 中选择 DDL 更新 DB
- c++ - 游戏经验和升级
- go - 在测试 buffalo 应用程序期间禁用信息日志