人気ブログランキング | 話題のタグを見る
MFCのCImageでPNGファイルのアルファブレンドがおかしいの解決方法
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);
    }
}

ソニーストア

by isoq | 2012-01-29 12:54 | C/C++/Win32
<< MFC なぜかメッセージボック... MFCリボンのバグ。 サブウイ... >>