Si quieres convertir a grises un bitmap mas pequeño, esto te valdría:
Code: Select all | Expand
#include "fivewin.ch"
#define ROSA rgb(255,0,255)
function main()
local o
DEFINE WINDOW o TITLE "Convertir a Escala de grises"
ACTIVATE WINDOW o ON PAINT Pinta( hDC )
return nil
function pinta( hDC )
local hDCMem := CreateCompatibleDC( hDC )
local hBmpMem, hOldBmp
local hIcon
local nTop, nLeft
local nColor
local nRojo, nVerde, nAzul
hBmpMem := CreateCompatibleBitmap( hDC, 34, 34 )
hOldBmp := SelectObject( hDCMem, hBmpMem )
FillSolidRect( hDCMem, {0,0,34,34}, ROSA )
hIcon := ExtractIcon( "FauxS-XP.ico") // Cualquiera vale
DrawIcon( hDCMem, 1, 1, hIcon )
for nTop := 1 to 32
for nLeft := 1 to 32
nColor := GetPixel( hDCMem, nTop, nLeft )
if nColor == ROSA
loop
endif
nRojo := GetRValue( nColor )
nVerde := GetGValue( nColor )
nAzul := GetBValue( nColor )
nColor := Int(nRojo*0.3 + nVerde*0.59 + nAzul*0.11)
SetPixel( hDCMem, nTop, nLeft, rgb( nColor, nColor, nColor) )
next
next
SelectObject( hDCMem, hOldBmp )
DrawMasked( hDC, hBmpMem, 10, 50 )
DrawIcon( hDC, 10, 10, hICon )
DeleteObject( hBmpMem )
DeleteDC( hDCMem )
DestroyIcon( hICon )
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <winuser.h>
#include <wingdi.h>
#include "hbapi.h"
HB_FUNC( CREATECOMPATIBLEBITMAP )
{
hb_retnl( (LONG) CreateCompatibleBitmap( ( HDC ) hb_parnl( 1 ), hb_parni( 2 ), hb_parni( 3 ) ));
}
HB_FUNC( CREATECOMPATIBLEDC )
{
hb_retnl( (LONG) CreateCompatibleDC( ( HDC ) hb_parnl( 1 )));
}
void FillSolidRectEx( HDC hDC, RECT *rct, COLORREF nColor )
{
nColor = SetBkColor( hDC , nColor );
ExtTextOut( hDC, 0, 0, ETO_OPAQUE, rct, NULL, 0, NULL);
SetBkColor( hDC, nColor );
}
HB_FUNC( FILLSOLIDRECT )
{
RECT rct;
COLORREF nColor = hb_parnl( 3 );
rct.top = hb_parni( 2, 1 );
rct.left = hb_parni( 2, 2 );
rct.bottom = hb_parni( 2, 3 );
rct.right = hb_parni( 2, 4 );
FillSolidRectEx( (HDC) hb_parnl( 1 ), &rct, nColor );
}
#pragma ENDDUMP
static function GetRValue( nRGB )
return nLoByte( nLoWord( nRGB ) )
static function GetGValue( nRGB )
return nHiByte( nLoWord( nRGB ) )
static function GetBValue( nRGB )
return nLoByte( nHiWord( nRGB ) )
Un saludo
Paco Garcia