2012-05-08 12 views
5

prendere l'immagine di seguito userò per i seguenti esempi:Ridimensiona la tela attorno a una bitmap?

Le dimensioni unchaged sono attualmente 96 x 71

enter image description here

Diciamo che ho voluto ridimensionare la tela per 115 x 80 - l'immagine risultante dovrebbe quindi:

enter image description here

Infine se ridimensionato a una dimensione più piccola tela originale era, per esempio 45 x 45 l'uscita appare in questo modo:

enter image description here

Questo è quello che ho provato finora:

procedure ResizeBitmapCanvas(Bitmap: TBitmap; H, W: Integer); 
var 
    Bmp: TBitmap; 
    Source, Dest: TRect; 
begin 
    Bmp := TBitmap.Create; 
    try 
    Source := Rect(0, 0, Bitmap.Width, Bitmap.Height); 
    Dest := Source; 
    Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); 
    Bitmap.SetSize(W, H); 
    Bmp.Assign(Bitmap); 
    Bmp.Canvas.FillRect(Source); 
    Bmp.Canvas.CopyRect(Dest, Bitmap.Canvas, Source); 
    Bitmap.Assign(Bmp); 
    finally 
    Bmp.Free; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ResizeBitmapCanvas(Image1.Picture.Bitmap, 110, 110); 
end; 

Se si prova quanto sopra su una bitmap caricata in una TImage la bitmap effettiva non si centra, tuttavia la tela cambia dimensione.

Le proprietà che ho impostato per l'Immagine sono:

Image1.AutoSize := True; 
Image1.Center := True; 
Image1.Stretch := False; 

penso che potrebbe essere la linea Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); che ha bisogno di guardare, per calcolare la posizione centrale corretta?

Il codice è stato adattato/modificato leggermente da una domanda recente David Heffernan ha risposto.

Come ridimensionare la tela che circonda una bitmap, ma senza allungare la bitmap?

+0

Nessun problema, li ho richiesti perché ritengo che siano importanti qui poiché si modifica la dimensione di 'TImage.Picture.Bitmap'. – TLama

+0

Sì hai ragione, l'ho completamente trascurato :) –

+0

Quindi, non è questo ciò che causa il comportamento, il 'AutoSize'? Prova con l'immagine semplice con un'immagine all'interno, imposta solo il 'Center' su True e ridimensiona il' TImage' in un designer di moduli. Vedrai la * tela circostante *; non è quello che stai chiedendo? – TLama

risposta

6

credo che questo è quello che stai cercando:

procedure ResizeBitmapCanvas(Bitmap: TBitmap; H, W: Integer; BackColor: TColor); 
var 
    Bmp: TBitmap; 
    Source, Dest: TRect; 
    Xshift, Yshift: Integer; 
begin 
    Xshift := (Bitmap.Width-W) div 2; 
    Yshift := (Bitmap.Height-H) div 2; 

    Source.Left := Max(0, Xshift); 
    Source.Top := Max(0, Yshift); 
    Source.Width := Min(W, Bitmap.Width); 
    Source.Height := Min(H, Bitmap.Height); 

    Dest.Left := Max(0, -Xshift); 
    Dest.Top := Max(0, -Yshift); 
    Dest.Width := Source.Width; 
    Dest.Height := Source.Height; 

    Bmp := TBitmap.Create; 
    try 
    Bmp.SetSize(W, H); 
    Bmp.Canvas.Brush.Style := bsSolid; 
    Bmp.Canvas.Brush.Color := BackColor; 
    Bmp.Canvas.FillRect(Rect(0, 0, W, H)); 
    Bmp.Canvas.CopyRect(Dest, Bitmap.Canvas, Source); 
    Bitmap.Assign(Bmp); 
    finally 
    Bmp.Free; 
    end; 
end; 

Non riesco a ricordare se XE supporta l'impostazione Width e Height per un TRect. In caso contrario, modificare il codice in

Source.Right := Source.Left + Min(W, Bitmap.Width); 

e così via.

+0

se i bit intorno al bordo significano la tela al di fuori della bitmap, allora sarebbe quello di riempirlo con un colore come prima. Ho giocato con il tuo codice precedente, quindi quello che ho postato nella domanda è adattato. Pensavo di poterlo modificare a questo scopo ma non ci sono riuscito. –

+0

OK, penso che il mio codice aggiornato faccia quello che vuoi. –

+0

Proprio così, grazie David. Sulla riga 'Bmp.Canvas.FillRect (Rect (0, 0, W, H));' dove hai trovato 0, 0 nei parametri? Sta dicendo semplicemente di riempire il rect dal pixel in alto a sinistra? –

Problemi correlati