Ver Mensaje Individual
  #5  
Antiguo 09-01-2023
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Si lo que deseas es bajar el tamaño de la imagen en pixels puedes usar Stretch de TImage o con la API StretchBlt de GDI pero el resultado es mejor usando GDIplus. En este hilo explico como hacerlo con GDIplus Flat con dos funciones básicas:
Código Delphi [-]
//---------------------------------------------------------------------------
// Dibuja un Bitmap en un hDC ajustando su tamaño para que quepa entero
// en las coordenadas dadas
procedure DrawImageRect(DC: HDC; Bitmap: HBITMAP; X, Y, W, H: integer);
var
  Graphics: Pointer;
  GBitmap:  THANDLE;
begin
  GdipCreateBitmapFromHBITMAP(Bitmap, 0, GBitmap);
  GdipCreateFromHDC(DC, Graphics);
  GdipDrawImageRect(Graphics, GBitmap, X, Y, W, H);
  GdipDisposeImage(GBitmap);
  GdipDeleteGraphics(Graphics);
end;

Código Delphi [-]
//-----------------------------------------------------------------------------
// Crea y devuelve un Bitmap con unas nuevas dimensiones y la imagen ajustada a estas
function CreateResizeBitmap(Bitmap: HBITMAP; H, W: integer): HBITMAP;
var
  Graphics: Pointer;
  GBitmap: THANDLE;
  DC, dcMem: HDC;
  bmOld: HBITMAP;
begin
  DC:= GetDC(0);
  Result:= CreateCompatibleBitmap(DC, W, H);
  dcMem:= CreateCompatibleDC(DC);
  bmOld:= SelectObject(dcMem, Result);

  GdipCreateFromHDC(dcMem, Graphics);
  GdipCreateBitmapFromHBITMAP(Bitmap, 0, GBitmap);
  GdipDrawImageRect(Graphics, GBitmap, 0, 0, H, W);
  GdipDisposeImage(GBitmap);
  GdipDeleteGraphics(Graphics);

  SelectObject(dcMem, bmOld);
  DeleteDC(dcMem);
  ReleaseDC(0, DC);
end;

El tema del formato final en el que se guarde la imagen es otro asunto que también se puede hacer con GDIplus.

Saludos.
Responder Con Cita