# Scaling rectangle

Hi,

I drew a rectangle in a TImage object.

The size of TImage is for example width = W and Height = H.

The rectangle has 4 coordinate positions, X1, Y1, X2, Y2.

Then, I proportionally shrink the TImage to be this size: width = W1 and Height = H1.

So, anyone know a formula to calculate the new X1, Y1, X2, and Y2, so the rectangle will still be proportional ?

Thanks
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
just from head, not tested, and maybe possible wrong

scalingfactor := NewHeight/OldHeight;

newX1 := x1*scalingfactor;
newY1 := y1*scalingfactor;
newX2 := y2*scalingfactor;
newY2 := y2*scalingfactor;

meikl ;-)
Senior developer, analyst and customer assistance Commented:
x := X*W1 div W;
x1 := X1*W1 div W;
y := y*H1 div H;
y1 := y1*H1 div H;

F68 ;-)
Senior developer, analyst and customer assistance Commented:
this time you're the faster meikl :))
Commented:
i'm not sure, if my calculation is correct, f68 :-)
Senior developer, analyst and customer assistance Commented:
infact looking better in your calculation y must depend on Width scaling factor, that could be different from the height one...
SO

WSCalingFactor := NewWIdth/OldWIdth;
HSCalingFactor := NewHeight/OldHeight;

x1 := x1*WSCalingFactor;
x2 := x2*WScalingFactor;
y1 := y1*HSCalingFactor;
y2 := y2*HScalingFactor;

F68 ;-)
Senior developer, analyst and customer assistance Commented:
ops...NewWIdth div OldWIdth...etc. etc. (result must be integer, not real)
Commented:
>ops...NewWIdth div OldWIdth...etc. etc. (result must be integer, not real)

just use round or trunc

>WSCalingFactor := NewWIdth/OldWIdth;
>HSCalingFactor := NewHeight/OldHeight;

i decided to use one scalingfactor, because
if the image is scaled proportional, then
WSCalingFactor and HSCalingFactor
should have the same value

meikl ;-)
Author Commented:
Well, after I tried, it does not works :( not because the calculation, but because of the way TImage stretching :(

I cant get the W1 and H1 (width and height after stretched proportionally).

Original TImage size W * H

then I have newTImage with "smaller" size (let say Wx and Hx).
I assigned TImage to the newTImage, so that newTImage contains TImage bitmap.

But then, I cant get the stretched image size in newTImage.

I checked newTImage.Width , it will always Wx
I checked newTImage.Picture.Width, it will always W (the same with TImage.Width).
Commented:
the picture width never changes,
only the visualizing of the TImage
is adjusted (autostretch-property is set to true)

if you want the picture scaled physically,
then use canvas-methods like

- Stretchdraw
- copyrect

or api like
- BitBlt

to create a new scaled picture

meikl ;-)
Commented:
instead of autostretch i meant autosize

a sample

unit image_scale_u;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Splitter1: TSplitter;
Panel3: TPanel;
Image1: TImage;
Image2: TImage;
Button1: TButton;
TrackBar1: TTrackBar;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
private
procedure scale;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{\$R *.dfm}

//scaling routine, craeting a scaled image
procedure TForm1.scale;
var bmp : TBitmap;
begin
image2.Picture := nil; //clear content;
bmp := TBitmap.Create;
try
bmp.Width := round(image1.Picture.Bitmap.Width*(trackbar1.Position/100));
bmp.Height := round(image1.Picture.Bitmap.Height*(trackbar1.Position/100));
//draw, not the fastest routine
bmp.Canvas.CopyRect(Rect(0,0,bmp.Width, bmp.height),
image1.Picture.Bitmap.Canvas,
Rect(0,0,image1.Picture.Bitmap.width,image1.Picture.Bitmap.height));
image2.Picture.Assign(bmp);  //show
finally
bmp.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
scale;
end;
end;

//scale on trackbarchange (range: 0%-500%)
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
scale;
end;

end.

meikl ;-)

Experts Exchange Solution brought to you by