Tengo mas código gdi+ ... con esto ya coloco las imagenes en la ventana , incluyendo png transparentes .
También tiene código para grabar la imagen leída en cualquiera de los formatos soportados , por ahora tenemos TIF,GIF ,JPG,PNG ,BMP
...................... editado ....................................
He cambiado la clase Image a gdiImage y cambiado el codigo para facilitar el añadir mas formatos de imagen facilmente .
Tambien he añadido una función para convertir imagenes entre formatos ( entre los soportados).
para gdiplus.cpp
HB_FUNC( GDIPLUSCREATEIMAGEFROMFILE )
{
Image * newImage = new Image( (LPCWSTR) hb_parc(1) );
hb_retnl( ( HB_LONG ) newImage );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWIMAGE )
{
int iParams = hb_pcount();
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Image * newImage = ( Image * ) hb_parnl( 2 );
int nLeft ;
int nTop ;
int nWidth ;
int nHeight;
switch (iParams){
case 4:
nLeft = hb_parni( 3 );
nTop = hb_parni( 4 );
graphics->DrawImage( newImage, nLeft, nTop );
case 6:
nLeft = hb_parni( 3 );
nTop = hb_parni( 4 );
nWidth = hb_parni( 5 );
nHeight = hb_parni( 6 );
graphics->DrawImage( newImage, nLeft, nTop,nWidth,nHeight);
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSIMAGESAVE )
{
Image * newImage = ( Image * ) hb_parnl( 1 );
CLSID cClsid ;
LPWSTR file = (LPWSTR) hb_parc(2);
LPWSTR identificador = (LPWSTR) hb_parc(3);
CLSIDFromString( identificador, &cClsid ) ;
newImage->Save( file , &cClsid, NULL);
}
para tgdiplus (este codigo aún sin revisar ) :
//----------------------------------------------------------------------------//
METHOD DrawImage( oImage,nTop,nleft, nWidth, nHeight ) CLASS Graphics
if Empty(nWidth ) .or. Empty( nHeight )
GdiPlusDrawImage( ::hGraphics, oImage:hImage, nTop, nLeft )
else
GdiPlusDrawImage( ::hGraphics, oImage:hImage,nTop,nLeft, nWidth, nHeight )
endif
Return nil
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSIMAGEFINALIZE )
{
Image * newImage = ( Image * ) hb_parnl( 1 );
newImage.Finalize();
}
...........
//----------------------------------------------------------------------------//
CLASS GDIImage
DATA hImage
DATA aCLSID
DATa aExtensions
METHOD New(cFile)
METHOD Destroy()
METHOD Save( cFile )
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cFile ) CLASS GDImage
::hImage = GdiPlusCreateImageFromFile( AnsiToWide( cFile ) )
::aExtIni := { "BMP", "JPG", "GIF", "TIF", "PNG" }
::aExtEnd := { "BMP", "JPG", "GIF", "TIF", "PNG" }
::aCLSID := { "{557CF400-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF401-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF402-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF405-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF406-1A04-11D3-9A73-0000F81EF32E}" ;
}
return Self
//----------------------------------------------------------------------------//
METHOD Save( cFile ) CLASS GDIImage
local cExtension := Upper(cFileExt(cFile))
local cCLSID
local nScan:= aScan( ::aExtEnd, cFile )
if nScan == 0
msginfo( "Formato no soportado" )
Return .f.
endif
cCLSID := aCLSID[ nScan ]
cCLSID = AnsiToWide( cCLSID )
cFile = AnsiToWide( cFile )
GdiPlusImageSave( ::hImage, cFile, cCLSID )
Return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS GDIImage
GdiPlusImageFinalize( ::hImage )
::hImage = nil
return nil
//----------------------------------------------------------------------------//
Function GDIPlusConvertImage( cImageIni, cImageEnd )
local cExtIni := Upper(cFileExt( cImageIni ))
local cExtEnd := Upper(cFileExt( cImageEnd ))
local oImage
local nScan
if cImageIni == cImageEnd
msginfo( "Error. La imagen inicial y final son la misma" )
Return .f.
endif
if( nScan:= aScan( oImage:aExtIni, cExtIni )) == 0
Msginfo( " el archivo "+ cImageIni + " tiene un formato no soportado")
return .f.
endif
if( nScan:= aScan( oImage:aExtEnd, cExtEnd )) == 0
Msginfo( " el archivo "+ cImageEnd + " tiene un formato no soportado")
return .f.
endif
oImage:= GDIImage():New( cImageIni )
oImage:Save( cImageEnd )
oImage:Destroy()
Return nil