Solved

# pixel to cm and cm to pixel how?

Posted on 2002-07-10
6,624 Views
Hi ,

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

Thanks..
0
Question by:Mozzak

LVL 7

Expert Comment

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

LVL 2

Accepted Solution

bugroger earned 50 total points
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

LVL 2

Expert Comment

i was too slow :-(
0

LVL 3

Expert Comment

listening...
0

Author Comment

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 Comment

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

Best Regards..
0

Author Comment

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

LVL 2

Expert Comment

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;

GL
bug
0

## Featured Post

### Suggested Solutions

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.