2012-05-08 45 views
5

Hãy hình dưới đây tôi sẽ sử dụng cho các ví dụ sau:Thay đổi kích thước khung hình xung quanh một bitmap?

Kích thước unchaged hiện đang 96 x 71

enter image description here

phép nói rằng tôi muốn thay đổi kích thước canvas để 115 x 80 - hình ảnh kết quả nên sau đó là:

enter image description here

Cuối cùng nếu tôi thay đổi kích cỡ nó đến một kích thước nhỏ hơn so với vải ban đầu là, ví dụ như 45 x 45 đầu ra sẽ xuất hiện như sau:

enter image description here

Đây là những gì tôi đã cố gắng cho đến nay:

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; 

Nếu bạn thử ở trên trên một bitmap được tải vào một TImage thì bitmap thực tế không ở giữa, canvas sẽ thay đổi kích thước.

Các thuộc tính tôi đã đặt ra cho hình ảnh là:

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

Tôi nghĩ rằng nó có thể là dòng Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); mà cần nhìn vào, để tính toán vị trí trung tâm có đúng không?

Mã đã được điều chỉnh/sửa đổi đôi chút từ câu hỏi gần đây David Heffernan trả lời.

Làm cách nào để thay đổi kích thước khung hình bao quanh bitmap, nhưng không kéo giãn bitmap?

+0

Không vấn đề gì, tôi đã yêu cầu họ vì tôi nghĩ chúng quan trọng ở đây vì bạn đang thay đổi kích thước 'TImage.Picture.Bitmap'. – TLama

+0

Có bạn đúng, tôi hoàn toàn bỏ qua nó :) –

+0

Vì vậy, không phải là những gì gây ra hành vi, 'AutoSize'? Hãy thử với hình ảnh đơn giản với một hình ảnh bên trong, chỉ đặt 'Center' là True và thay đổi kích thước' TImage' trong một trình thiết kế biểu mẫu. Bạn sẽ thấy * canvas xung quanh *; không phải là những gì bạn đang yêu cầu? – TLama

Trả lời

6

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm:

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; 

Tôi không thể nhớ nếu XE hỗ trợ thiết WidthHeight cho một TRect. Nếu không, hãy thay đổi mã thành

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

v.v.

+0

nếu các bit xung quanh cạnh bạn có nghĩa là canvas bên ngoài bitmap thì đó sẽ là để điền nó với một màu như trước. Tôi đã được chơi xung quanh với mã trước đó của bạn, do đó một trong tôi đăng trong câu hỏi là thích nghi. Tôi nghĩ rằng tôi có thể tinh chỉnh nó cho mục đích này nhưng đã không thể. –

+0

OK, tôi nghĩ mã cập nhật của tôi sẽ làm những gì bạn muốn. –

+0

Đó chính xác là cảm ơn David. Trên dòng 'Bmp.Canvas.FillRect (Rect (0, 0, W, H));' bạn đã đưa ra 0, 0 trong tham số ở đâu? Đây có phải là chỉ cần nói cho nó để điền vào các rect từ trên cùng bên trái nhất pixel? –

Các vấn đề liên quan