Re: バグ報告スレッド 11 Ver2.20ベータ公開中 [ No.433 ]
メンテ
 2016/12/02 19:31
 ピッコロ
自分が持っているソフトで画像を透過できなかったソフトです。

 Photoshop 7.0

 AzPainter2 2.12

で確認できました。

自作ソフトのソースを確認したところ、32bitDCではなく、
32bitイメージを作成してそこに読み込んでいるようでした。

8bit と それより大きいbit数のイメージにしか対応していないので
次のようになっています。

イメージ作成部分 CImageEX は CImageを継承しています。
CImageのアルファーブレンドは、あまりにもお粗末なので
その部分だけ改造したものです。
直接SDKを使っている場合は、CImageのソースファイルを参照
してください。

BOOL CLayer::CreateImg( CSize size, const RGBQUAD* pPaletts, BOOL flgCpy, int nBit )
{
CImageEx* pImg = new CImageEx;
if ( pImg == NULL ) return FALSE;
if ( nBit == 8 ) {
pImg->Create( size.cx, size.cy, 8 );
pImg->SetColorTable( 0, 64, pPaletts );
int idxPlt = 64 + m_nID*16;
pImg->SetColorTable( idxPlt, 16, pPaletts + idxPlt );
pImg->SetTransparentColor( 0 );
}
else {
pImg->Create( size.cx, size.cy, 32, CImage::createAlphaChannel );

}

if ( m_pImg ) {
if ( flgCpy ) {
HDC dc = pImg->GetDC();
if ( dc ) {
int w = size.cx;
int h = size.cy;
if ( m_pImg->GetWidth() < w ) w = m_pImg->GetWidth();
if ( m_pImg->GetHeight() < h ) h = m_pImg->GetHeight();
if ( m_nBit == nBit ) {
BOOL flg = m_pImg->BitBlt( dc, 0, 0, w, h, 0, 0 );
}
else {
::Img8to32( m_pImg, pImg, pPaletts, 0, 0, w, h );
}
pImg->ReleaseDC();
}
}
DeleteImg();
}
m_nBit = nBit;
m_pImg = pImg;
if ( m_nBit == 8 ) {
SetPalette( pPaletts );
}

return TRUE;
}


以下が読み込んだ部分です。

CImageEx img;
if ( img.Load(m_layers[id].m_strFilePath) != 0 ) {
AfxMessageBox( _T("イメージの読み込みに失敗しました。") );
return FALSE;
}