Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 6826
  • Last Modified:

pixel to cm and cm to pixel how?

Hi ,

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

Thanks..
0
Mozzak
Asked:
Mozzak
1 Solution
 
CynnaCommented:
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
 
bugrogerCommented:
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
 
bugrogerCommented:
i was too slow :-(
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
lopemCommented:
listening...
0
 
MozzakAuthor 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
 
MozzakAuthor Commented:
I had solve the problem and the real rate must be 2.5400181214134702506795530051344 .

Best Regards..
0
 
MozzakAuthor Commented:
Still its not working after more than 2-3 try . For example 789 . What is the problem ? I'm taking 789,000000000002
0
 
bugrogerCommented:
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

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now