Ogólnie chciałbym zmniejszyć bitmapę do określonych rozmiarów, ale robiąc to wg funkcji zawartych w Canvas, obraz jest albo rozciągany, albo po prostu ma potem na sobie jakieś dziwne linie, kropki i nie wiadomo co. Na razie udało mi się stworzyć coś takiego.
Mój kod:
function ResizeBitmap(Bitmap: TBitmap; Width, Height: Integer; Background: TColor): TBitmap
var
B: TBitmap;
RX, RY, R: integer;
OX, OY: integer;
begin
RX := Bitmap.Width - Width;
RY := Bitmap.Height - Height;
if Width <= Bitmap.Width- RY then begin //jeżeli przyszłe zmniejszenie wysokości nie będzie mniejsze od szerokości
OX := Bitmap.Width;
OY := Bitmap.Height;
R := RY;
B.Width:= Bitmap.Width-R;
B.Height:= Bitmap.Height-R;
B.Canvas.StretchDraw( Rect( 0, 0, Bitmap.Width-R, Bitmap.Height-R ), Bitmap ); //zmniejsz rozmiar
Bitmap.Width:= Width;
Bitmap.Height:= Height;
Bitmap.Canvas.Brush.Color:= Background;
Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
Bitmap.Canvas.CopyRect( Rect(0, 0, Width, Height),
B.Canvas,
Rect(R, 0, B.Width-Trunc((B.Width-Width)/2), B.Height)); //wytnij boki po zmniejszeniu
//Bitmap.Canvas.Draw(0, 0, B);
end else { if Height <= Bitmap.Height- RX then } begin //jeżeli przyszłe zmniejszenie szerokości nie będzie mniejsze od wysokoci
OX := Bitmap.Width;
OY := Bitmap.Height;
R := RX;
B.Width:= Bitmap.Width-R;
B.Height:= Bitmap.Height-R;
B.Canvas.StretchDraw( Rect( 0, 0, Bitmap.Width-R, Bitmap.Height-R ), Bitmap ); //zmniejsz rozmiar
Bitmap.Width:= Width;
Bitmap.Height:= Height;
Bitmap.Canvas.Brush.Color:= Background;
Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
Bitmap.Canvas.CopyRect( Rect(0, 0, Width, Height),
B.Canvas,
Rect(0, R, B.Width, B.Height-Trunc((B.Height-Height)/2))); //wytnij górę i dół po zmniejszeniu
//Bitmap.Canvas.Draw(0, 0, B);
end;
B.Free;
result := Bitmap;
end;
X1,Y1 X1,Y1
------------------------------ ------------------------------
| X2,Y2 | | X2,Y2 |
| ------------------------ | | ------------------------ |
| | | X3,Y3 | | | | | | |
| | | | | | | |----------------------| |
| | | | | | | | X3,Y3 | |
| | | | | | | | | |
| ------------------------ | | | | |
| | | |----------------------| |
------------------------------ | | | |
| ------------------------ |
| |
------------------------------
X1,Y1 - to rozmiary obrazka domyślnego
X3,Y3 - to rozmiary docelowe
ale czasem obraz wychodzi rozciągnięty w pionie albo w poziomie jak nie dostosuję odpowiednich proporcji
Chciałbym najpierw dostosować obraz tak aby jego długość albo wysokość była dostosowana do przyszłego rozmiaru, a następnie te elementy które się nie zmieściły odciąć, tak aby obraz nie był rozciągnięty.
Czytałem jeszcze na temat algorytmów Najbliższego sąsiedztwa i Interpolacji dwuliniowej, ale niestety te algorytmy są za wolne, dla programu w którym obraz jest zmniejszany ilektroć zmieniam rozmiar formy, czy ją przenoszę, zawsze zawiesza się na jakieś 2, 3 sekundy, także te algorytmy nie są dobre jak dla mnie, (może do programu graficznego jak najbardziej).