2010-05-07 21 views
5

Tôi đang sử dụng Kéo dài = True trên một TImage với bitmap 256x256. Điều này được thu nhỏ xuống 1,2,4 hoặc 8 Như dự kiến, văn bản trên bitmap trở nên khủng khiếp hơn tôi khởi hành từ '1'. Tôi nhận thấy rằng Windows 7 explorer làm cho một phiên bản thu nhỏ của bitmap 'mềm hơn' và dễ chịu hơn. Có thể 'làm mờ' một TBitmap theo cách này không?Có thể làm mịn một TBitmap thu nhỏ trong Delphi không?

Trả lời

8

Tôi cho rằng bạn có nghĩa là Kéo dài = True trên một TImage, không phải trên A TBitmap.

Thật không may TImage không có bộ dựng lại được tích hợp sẵn, khi nói đến việc thay đổi kích thước hình ảnh trong đó. Khuyến nghị của tôi là sử dụng Graphics32 vì nó hỗ trợ nhiều loại bộ lấy mẫu khác nhau (một số tốt hơn để tăng kích thước khác để giảm kích thước)

+0

Cảm ơn, đã sửa văn bản. Tốt gợi ý lại Graphics32. –

9

Bằng cách sử dụng HALFTONE StretchBltMode, bạn sẽ nhận được kết quả mượt mà hơn bình thường. Điều này sẽ chỉ hoạt động trong cửa sổ 2000 trở lên

procedure SmoothResize(); 
var pt:TPoint; 
    h: HDC; 
begin 
    h := imgMainPicture.Canvas.Handle; 
    // Previous call to StretchDraw 
    // imgMainPicture.Canvas.StretchDraw(Rect(0, 0, imgMainPicture.Width - 1, 
    // imgMainPicture.Height - 1), curPicture.AnnotatedBitmap); 
    // Normal StretchDraw uses STRETCH_DELETESCANS as StretchBltMode , HALFTONE should give better results 
    GetBrushOrgEx(h, pt); 
    SetStretchBltMode(h, HALFTONE); 
    SetBrushOrgEx(h, pt.x, pt.y, @pt); 
    StretchBlt(h, 0, 0, imgMainPicture.Width - 1, 
    imgMainPicture.Height - 1, curPicture.AnnotatedBitmap.Canvas.Handle, 
    0, 0, curPicture.Width,curPicture.Height,SRCCOPY); 
end; 
+0

Đề xuất tuyệt vời, cảm ơn. –

+0

@BrianFrost HALFTONE hoặc STRETCH_HALFTONE là IMHO đặt cược tốt nhất của bạn, đây là một số mã http://code.google.com/p/delphigeist-delphi-stuff/source/browse/trunk/SynMiniMap/src/SynMiniMap.pas – ComputerSaysNo

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