Esempio n. 1
0
HRESULT BitmapUtil::MyCreateFromGdiplusBitmap( Gdiplus::Bitmap& bmSrc ) throw()
{
	Gdiplus::PixelFormat eSrcPixelFormat = bmSrc.GetPixelFormat();
	UINT nBPP = 32;
	DWORD dwFlags = 0;
	Gdiplus::PixelFormat eDestPixelFormat = PixelFormat32bppRGB;
	if( eSrcPixelFormat&PixelFormatGDI )
	{
		nBPP = Gdiplus::GetPixelFormatSize( eSrcPixelFormat );
		eDestPixelFormat = eSrcPixelFormat;
	}
	if( Gdiplus::IsAlphaPixelFormat( eSrcPixelFormat ) )
	{
		nBPP = 32;
		dwFlags |= createAlphaChannel;
		eDestPixelFormat = PixelFormat32bppARGB;
	}

	BOOL bSuccess = Create( bmSrc.GetWidth(), bmSrc.GetHeight(), nBPP, dwFlags );
	if( !bSuccess )
	{
		return( E_FAIL );
	}
	Gdiplus::ColorPalette* pPalette = NULL;
	if( Gdiplus::IsIndexedPixelFormat( eSrcPixelFormat ) )
	{
		UINT nPaletteSize = bmSrc.GetPaletteSize();

		pPalette = static_cast< Gdiplus::ColorPalette* >( _alloca( nPaletteSize ) );
		bmSrc.GetPalette( pPalette, nPaletteSize );

		RGBQUAD argbPalette[256];
		ATLASSERT( (pPalette->Count > 0) && (pPalette->Count <= 256) );
		for( UINT iColor = 0; iColor < pPalette->Count; iColor++ )
		{
			Gdiplus::ARGB color = pPalette->Entries[iColor];
			argbPalette[iColor].rgbRed = BYTE( color>>RED_SHIFT );
			argbPalette[iColor].rgbGreen = BYTE( color>>GREEN_SHIFT );
			argbPalette[iColor].rgbBlue = BYTE( color>>BLUE_SHIFT );
			argbPalette[iColor].rgbReserved = 0;
		}

		SetColorTable( 0, pPalette->Count, argbPalette );
	}

	if( eDestPixelFormat == eSrcPixelFormat )
	{
		// The pixel formats are identical, so just memcpy the rows.
		Gdiplus::BitmapData data;
		Gdiplus::Rect rect( 0, 0, GetWidth(), GetHeight() );
		bmSrc.LockBits( &rect, Gdiplus::ImageLockModeRead, eSrcPixelFormat, &data );

		UINT nBytesPerRow = AtlAlignUp( nBPP*GetWidth(), 8 )/8;
		BYTE* pbDestRow = static_cast< BYTE* >( GetBits() );
		BYTE* pbSrcRow = static_cast< BYTE* >( data.Scan0 );
		for( int y = 0; y < GetHeight(); y++ )
		{
			memcpy( pbDestRow, pbSrcRow, nBytesPerRow );
			pbDestRow += GetPitch();
			pbSrcRow += data.Stride;
		}

		bmSrc.UnlockBits( &data );
	}
	else
	{
		// Let GDI+ work its magic
		Gdiplus::Bitmap bmDest( GetWidth(), GetHeight(), GetPitch(), eDestPixelFormat, static_cast< BYTE* >( GetBits() ) );
		Gdiplus::Graphics gDest( &bmDest );

		gDest.DrawImage( &bmSrc, 0, 0 );
	}

	return( S_OK );
}
void CXTPFlowGraphImage::ImageChanged()
{
	CMDTARGET_RELEASE(m_pIcon);

	if (!m_pImage || m_pImage->GetLastStatus() != Gdiplus::Ok)
	{
		SAFE_DELETE(m_pImage);
	}

	m_szImage = CSize(0, 0);
	if (!m_pImage)
		return;

	m_szImage = CSize(m_pImage->GetWidth(), m_pImage->GetHeight());


	Gdiplus::PixelFormat eSrcPixelFormat = m_pImage->GetPixelFormat();
	UINT nBPP = 32;
	Gdiplus::PixelFormat eDestPixelFormat = PixelFormat32bppRGB;

	if( eSrcPixelFormat & PixelFormatGDI )
	{
		nBPP = Gdiplus::GetPixelFormatSize( eSrcPixelFormat );
		eDestPixelFormat = eSrcPixelFormat;
	}

	BOOL bAlpha = FALSE;
	if( Gdiplus::IsAlphaPixelFormat( eSrcPixelFormat ) )
	{
		nBPP = 32;
		bAlpha = TRUE;
		eDestPixelFormat = PixelFormat32bppARGB;
	}


	LPBYTE lpBits;
	HBITMAP hBitmap = CXTPImageManager::Create32BPPDIBSection(0, m_szImage.cx, m_szImage.cy, &lpBits);

	int nPitch = ( (((m_szImage.cx * nBPP)+31)/32)*4 );

	if( eDestPixelFormat == eSrcPixelFormat && nBPP == 32)
	{
		// The pixel formats are identical, so just memcpy the rows.
		Gdiplus::BitmapData data;
		Gdiplus::Rect rect( 0, 0, m_szImage.cx, m_szImage.cy );
		if(m_pImage->LockBits( &rect, Gdiplus::ImageLockModeRead, eSrcPixelFormat, &data )!=Gdiplus::Ok)
		{
			return;
		}

		size_t nBytesPerRow = XTPAlignUp( nBPP * m_szImage.cx, 8 )/8;
		BYTE* pbDestRow = static_cast< BYTE* >( lpBits );
		BYTE* pbSrcRow = static_cast< BYTE* >( data.Scan0 );
		for( int y = 0; y < m_szImage.cy; y++ )
		{
			MEMCPY_S(pbDestRow, pbSrcRow, nBytesPerRow);
			pbDestRow += nPitch;
			pbSrcRow += data.Stride;
		}

		m_pImage->UnlockBits( &data );
	}
	else
	{
		// Let GDI+ work its magic
		Gdiplus::Bitmap bmDest( m_szImage.cx, m_szImage.cy, nPitch, eDestPixelFormat, static_cast< BYTE* >( lpBits) );
		Gdiplus::Graphics gDest( &bmDest );

		gDest.DrawImage(m_pImage, 0, 0 );
	}

	CBitmap bmpIcons;
	bmpIcons.Attach(hBitmap);
	UINT nCommand[] = {0};

	m_pParent->GetImageManager()->SetIcons(bmpIcons, nCommand, 1, m_szImage, xtpImageNormal, bAlpha);

	m_pIcon = m_pParent->GetImageManager()->GetImage(nCommand[0], m_szImage.cx);

	if (m_pIcon)
	{
		m_pIcon->InternalAddRef();
	}

}
Esempio n. 3
0
    void Convert(
        const char* pSrc,
        const char* pDst,
        RawImgFormat eImgFormat = Raw_RGB_Unknown
        )
    {
        CInitGDIPlus initGDIPlus;
        initGDIPlus.Init();

        {

        
        Gdiplus::Bitmap bmSrc( (CT2W)pSrc );
        if( bmSrc.GetLastStatus() != Gdiplus::Ok )
        {
            throw "Load Image File Failed!";
        }

        m_nHeight = bmSrc.GetHeight();
        m_nWidth = bmSrc.GetWidth();

        Gdiplus::PixelFormat eSrcPixelFormat = bmSrc.GetPixelFormat();
        if ( eSrcPixelFormat != PixelFormat24bppRGB && 
            eSrcPixelFormat != PixelFormat32bppARGB )
        {
            throw "Unport Image Format!";
        }

        UINT nBPP = 32;
        DWORD dwFlags = 0;
        Gdiplus::PixelFormat eDestPixelFormat = PixelFormat32bppRGB;
        if( eSrcPixelFormat&PixelFormatGDI )
        {
            nBPP = Gdiplus::GetPixelFormatSize( eSrcPixelFormat );
            eDestPixelFormat = eSrcPixelFormat;
        }
        if( Gdiplus::IsAlphaPixelFormat( eSrcPixelFormat ) )
        {
            nBPP = 32;
            dwFlags |= 0x01;//createAlphaChannel;
            eDestPixelFormat = PixelFormat32bppARGB;
        }
        m_pDst = new BYTE[nBPP/8*m_nHeight*m_nWidth];

        //BOOL bSuccess = Create( bmSrc.GetWidth(), bmSrc.GetHeight(), nBPP, dwFlags );
        //if( !bSuccess )
        //{
        //    return( E_FAIL );
        //}
        USES_ATL_SAFE_ALLOCA;
        Gdiplus::ColorPalette* pPalette = NULL;
        if( Gdiplus::IsIndexedPixelFormat( eSrcPixelFormat ) )
        {
            //assert(false);
            throw "Unsuport Indexed Pixel!";
            //UINT nPaletteSize = bmSrc.GetPaletteSize();
            //pPalette = static_cast< Gdiplus::ColorPalette* >( _ATL_SAFE_ALLOCA(nPaletteSize, _ATL_SAFE_ALLOCA_DEF_THRESHOLD) );

            //if( pPalette == NULL )
            //    return E_OUTOFMEMORY;

            //bmSrc.GetPalette( pPalette, nPaletteSize );

            //RGBQUAD argbPalette[256];
            //ATLASSERT( (pPalette->Count > 0) && (pPalette->Count <= 256) );
            //for( UINT iColor = 0; iColor < pPalette->Count; iColor++ )
            //{
            //    Gdiplus::ARGB color = pPalette->Entries[iColor];
            //    argbPalette[iColor].rgbRed = (BYTE)( (color>>RED_SHIFT) & 0xff );
            //    argbPalette[iColor].rgbGreen = (BYTE)( (color>>GREEN_SHIFT) & 0xff );
            //    argbPalette[iColor].rgbBlue = (BYTE)( (color>>BLUE_SHIFT) & 0xff );
            //    argbPalette[iColor].rgbReserved = 0;
            //}

            //SetColorTable( 0, pPalette->Count, argbPalette );
        }

        if( eDestPixelFormat == eSrcPixelFormat )
        {
            // The pixel formats are identical, so just memcpy the rows.
            Gdiplus::BitmapData data;
            Gdiplus::Rect rect( 0, 0, bmSrc.GetWidth(), bmSrc.GetHeight() );
            if(bmSrc.LockBits( &rect, Gdiplus::ImageLockModeRead, eSrcPixelFormat, &data )!=Gdiplus::Ok)
            {
                throw "bmSrc.LockBits E_OUTOFMEMORY";
                //return E_OUTOFMEMORY;
            }

            size_t nBytesPerRow = AtlAlignUp( nBPP*bmSrc.GetWidth(), 8 )/8;
            BYTE* pbDestRow = m_pDst;//static_cast< BYTE* >( GetBits() );
            BYTE* pbSrcRow = static_cast< BYTE* >( data.Scan0 );
            for( int y = 0; y < bmSrc.GetHeight(); y++ )
            {
                Checked::memcpy_s(pbDestRow, nBytesPerRow, pbSrcRow, nBytesPerRow);
                pbDestRow += nBytesPerRow;//GetPitch();
                pbSrcRow += data.Stride;
            }

            bmSrc.UnlockBits( &data );
        }
        else
        {
            size_t nBytesPerRow = AtlAlignUp( nBPP*bmSrc.GetWidth(), 8 )/8;
            // Let GDI+ work its magic
            Gdiplus::Bitmap bmDest( 
                bmSrc.GetWidth(),
                bmSrc.GetHeight(),
                nBytesPerRow, // GetPitch(),
                eDestPixelFormat, m_pDst); //static_cast< BYTE* >( GetBits() ) );
            Gdiplus::Graphics gDest( &bmDest );

            gDest.DrawImage( &bmSrc, 0, 0 );
        }

        }
        initGDIPlus.Unit();
    };