Armando, yo he conseguido hacerlo así, pero solo para bitmaps tipo BMP de 24 bits (lo he probado con un bitmap pequeño de 256X256, con más grandes supong que fucionará igual):
Necesitas tres campos en tu base d datos: ANCHO, ALTO y DATOS (de la imagen). los dos primeros numéricos y el último un MEMO.
- Code: Select all Expand view
FUNCTION Prueba()
LOCAL oDlg
LOCAL nWidth,nHeight
LOCAL hBmp
LOCAL cImg := CurDrive()+":\"+CurDir()+"\PAISAJE.bmp" // imagen BMP de 24 bits
*
cImg := MEMOREAD( cImg )
nWidth = ASC(SubStr(cimg,19,1))+(ASC(SubStr(cimg,20,1))*256)+(ASC(SubStr(cimg,21,1))*65536)
nHeight = ASC(SubStr(cimg,23,1))+(ASC(SubStr(cimg,24,1))*256)+(ASC(SubStr(cimg,25,1))*65536)
cImg := SubStr(cImg,55) // DATOS DE LA IMAGEN
*
hBmp := BuildImage( nWidth, nHeight, cImg )
*
DEFINE DIALOG oDlg SIZE 350,350
oDlg:bPainted := { |hDc| PaintPrb(hDc,hBmp) }
ACTIVATE DIALOG oDlg CENTER
DeleteObject( hBmp )
RETURN NIL
*
FUNCTION PaintPrb(hDc,hBit)
PalBmpDraw( hDc,10,10,hBit)
RETURN NIL
Me explico: Carga la imagen como si fuera un TXT, con MEMOREAD(), calculas nWidth, nHeight y cImage como en el ejemplo y guarda nWidth en el campo ANCHO, nHeight en el campo ALTO y cImage en el MEMO DATOS.
Para reconstruir la imagen he creado la función en C++ (borland 5.5) BUILDIMAGE, este es el código.
- Code: Select all Expand view
HB_FUNC( BUILDIMAGE ) // BuildImage( nWidth, nHeight, cImage )
{
HDC hDc1 = CreateCompatibleDC( NULL ) ;
int nWidth = hb_parni( 1 ) ;
int nHeight = hb_parni( 2 ) ;
LPSTR cImage = hb_parc( 3 ) ;
BITMAPINFO bmi ;
HBITMAP hBitmap ;
VOID *pvBits ;
int i,j,k,v ;
int nQWidth = ((( nWidth * 24 + 31 ) & ~31 ) >> 3 ) ;
bmi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ) ;
bmi.bmiHeader.biWidth = nWidth ;
bmi.bmiHeader.biHeight = nHeight ;
bmi.bmiHeader.biPlanes = 1 ;
bmi.bmiHeader.biBitCount = 24 ;
bmi.bmiHeader.biCompression = BI_RGB ;
bmi.bmiHeader.biSizeImage = nQWidth * nHeight ;
hBitmap = CreateDIBSection( hDc1, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0 ) ;
v = 0 ;
for ( i = 0; i < nHeight; ++i )
{
k = i * nQWidth ;
for ( j = 0; j < (nWidth*3); j += 3 )
{
( (BYTE *) pvBits )[k+j+0] = ( BYTE ) cImage[ v+0 ] ;
( (BYTE *) pvBits )[k+j+1] = ( BYTE ) cImage[ v+1 ] ;
( (BYTE *) pvBits )[k+j+2] = ( BYTE ) cImage[ v+2 ] ;
v += 3 ;
}
}
DeleteDC( hDc1 ) ;
hb_retnl( ( LONG ) hBitmap ) ;
}
A mi me funciona perfectamente.
Para compilar la función en C++ tendrás que utilizar las cabeceras pertinentes (alguien habrá que sepas cuales son). Lo que pasa es que yo lo he hecho incluyendo esa función en una librería en la que tengo varias funciones de C++ y no se que cabeceras se utilizan para FWH con PRAGMA (nunca lo he heco).
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55