CImageで、PNGファイルを読み込むと、アルファブレンドがおかしい。
Photoshop、Office、Windows Paint(on Win7)では、正常に表示できる画像が、CImageで読み込むと、色が崩れたり、アルファ値がおかしかったりする。 Visual Studio 2010 IDE のリソースエディタ で読み込んでも、CImage と同じ画像が出てくるので、CImage自体に問題があり、Visual Studio 2010にもその問題が引き継がれているらしい。
これは、おそらくCImage のバグ。
なかなか原因がつかめなかったのですが、次のサイトで解決策を発見。
wrong alpha blending with CImage::AlphaBlend() & *.png
これを参考に、次のようにして問題が解決しました。
CImage m_image;
if(SUCCEEDED(m_image->Load(strFileName)))
{
if(m_image->GetBPP() == 32)
{
// PNGのアルファ問題回避
if(strFileName.Right(3).CompareNoCase(_T("png")) == 0)
{
unsigned char * pCol = 0;
long w = m_image->GetWidth();
long h = m_image->GetHeight();
for(long y = 0; y < h; y ++)
{
for(long x = 0; x < w; x ++)
{
pCol = (unsigned char *)m_image->GetPixelAddress(x,y);
unsigned char alpha = pCol[3];
if(alpha != 255)
{
pCol[0] = ((pCol[0] * alpha) + 128) >> 8;
pCol[1] = ((pCol[1] * alpha) + 128) >> 8;
pCol[2] = ((pCol[2] * alpha) + 128) >> 8;
}
}
}
}
// アルファチャンネルON
m_image->SetHasAlphaChannel(true);
}
}