pixel to cm and cm to pixel how?

Hi ,

How can i convert pixel value to cm and cm to pixel ?

Thanks..
Asked:
Who is Participating?

Commented:
hi,

try this function:

function GetPixelCM(pixelcount : integer) : extended;
begin
// 1 inch = 2,54 cm
Result := (2.54 / Screen.PixelsPerInch) * pixelCount;
end;

GL
bug

0

Commented:
Here's a simple example (copy/paste & place 2 buttons on the form...):

procedure CmPerPixel(canvas:TCanvas; var xcmpp,ycmpp: Real);
var h:HDC;
hres,vres,hsiz,vsiz:integer;
begin
h:=canvas.handle;
hres := GetDeviceCaps(h,HORZRES);   {display width in pixels}
vres := GetDeviceCaps(h,VERTRES);   {display height in pixels}
hsiz := GetDeviceCaps(h,HORZSIZE);  {display width in mm}
vsiz := GetDeviceCaps(h,VERTSIZE);  {display height in mm}
xcmpp := hsiz/hres*0.1;
ycmpp := vsiz/vres*0.1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var xcmpp,ycmpp: Real; // pixel-> cm
begin
CmPerPixel(Form1.Canvas, xcmpp,ycmpp);
Caption:='100 pixels are '+FloatToStr(xcmpp*100)+' cm wide and '+FloatToStr(ycmpp*100)+' cm high';
end;

procedure TForm1.Button2Click(Sender: TObject);
var xcmpp,ycmpp: Real; // cm -> pixel
begin
CmPerPixel(Form1.Canvas, xcmpp,ycmpp);
Caption:='3 cm are '+FloatToStr(1/xcmpp*3)+' pixels wide and '+FloatToStr(1/ycmpp*3)+' pixels high';
end;

0

Commented:
i was too slow :-(
0

Commented:
listening...
0

Author Commented:
Bugroger i try to use your code because its easy..

Here is my code ;

MyPrinter = class
function PixelToCM(pixelcount : integer):extended ;
function CMToPixel(cm : extended):extended ;
end ;

function MyPrinter.CMToPixel(cm: extended):extended;
begin
{ i wrote }
Result := (cm / 2.54) * Screen.PixelsPerInch ;
end;

function MyPrinter.PixelToCM(pixelcount: integer):extended;
begin
{ inch = 2,54 cm bugroger wrote }
Result := (2.54 / Screen.PixelsPerInch) * pixelCount ;
end;
---------------------------------------------------------
when i try to use like these ;

procedure TForm1.Button1Click(Sender: TObject);
var
vconv : TTinaPrinter ;
begin
vconv := TTinaPrinter.Create ;
Edit1.Text := Floattostr(vconv.PixelToCM(strtoint(Edit1.Text))) ;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
vconv : TTinaPrinter ;
begin
vconv := TTinaPrinter.Create ;
Edit1.Text := Floattostr(vconv.CMToPixel(strtofloat(Edit1.Text))) ;

end;
---------------------------------------------------------
problem occurs some times..for example try to calculate 5 first with button1 then use button2 for turn to 5 again but it will be 5,00000000000001.

Can you give me the real value of inch/cm ? or different ssolution .
0

Author Commented:
I had solve the problem and the real rate must be 2.5400181214134702506795530051344 .

Best Regards..
0

Author Commented:
Still its not working after more than 2-3 try . For example 789 . What is the problem ? I'm taking 789,000000000002
0

Commented:
hi Mozzak

this occurs because of rounding in FloatToStr
if you convert the extended value
to string and back.

now it should work! I have used FloatToStrF instead
of FloatToStr

Have a look to Button3Click.
If you don't convert the extended value (test)
to string and back it works fine!

procedure TForm1.Button1Click(Sender: TObject);
var
vconv : MyPrinter;
begin
vconv := MyPrinter.Create ;
Edit1.Text := FloatToStrF(vconv.PixelToCM(strtoInt(Edit1.Text)), ffGeneral, 20, 0) ;
vconv.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
vconv : MyPrinter;
begin
vconv := MyPrinter.Create ;
Edit1.Text := FloattostrF(vconv.CMToPixel(strtofloat(Edit1.Text)), ffGeneral, 5,0) ;
vconv.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
vconv : MyPrinter;
test : extended;

begin
vconv := MyPrinter.Create ;
test := vconv.PixelToCM(strtoInt(Edit1.Text));
Edit1.Text := Floattostr(vconv.CMToPixel(test));
vconv.Free;
end;

Hope this solve your problems
GL
bug
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Already a member? Login.

All Courses

From novice to tech pro — start learning today.