Intentando aprender manejo de bitmaps - II
Esto fue otras de las cosas que hice, usar la funcion de las API GetDeviceCaps , da información específica sobre cierto dispositivo, para identificarlo lo hacemos mediante un handler, en mi caso el de la imagen img.Bitmap.Canvas.Handle.
Estos son los parámetros de la función que creí necesarios para mis cálculos:
- HORZSIZE Anchura, en milímetros, de la pantalla física.
- VERTSIZE Altura, en milímetros, de la pantalla física.
- HORZRES Anchura, en pixels, de la pantalla.
- VERTRES Altura, en líneas, de la pantalla.
Este método no da el resultado que buscaba, pero si otro interesante: la medida de la distancia real entre dos puntos de pantalla en mm.
img:TImage // contiene al bitmap
// Relación horizontal y vertical entre pixels y mm
function TCmdCalcEscala.PixelHorizToMM(deltaX: Double): Double;
var
hdcDesk:HDC;
Begin
hdcDesk:= img.Bitmap.Canvas.Handle; //
Antes hdcDesk:= img.Canvas.Handle;
try
result:= deltaX * (GetDeviceCaps(hdcDesk, HORZSIZE) /
GetDeviceCaps(hdcDesk,HORZRES));
finally
ReleaseDC(hdcDesk, hdcDesk);
end;
End;>
// Relación vertical entre pixels y mm
function TCmdCalcEscala.PixelVertiToMM(deltaY: Double): Double;
var
hdcDesk:HDC;
Begin
hdcDesk:= img.Bitmap.Canvas.Handle;
try
result:= deltaY * (GetDeviceCaps(hdcDesk, VERTSIZE) /
GetDeviceCaps(hdcDesk,VERTRES));
finally
ReleaseDC(hdcDesk, hdcDesk);
end;
End;
function TCmdCalcEscala.distancia(X,Y:Double): Double;
Begin
// X distancia horizontal, Y distancia vertical
result:=Abs(Sqrt(Sqr(x) + Sqr(y)));
End;
function TCmdCalcEscala.deltaPixels(X,Y:Double):Double;
Begin
result := Abs(X - Y);
End;
Ahi obtengo el factor escala que será aplicado a todas las medidas posteriores, para las medidas de los puntos en pantalla, creo que puede ser un resultado interesante.
//Calcula la relación entre pixels y mm.
procedure TCmdCalcEscala.ejecutar(Pto1:TPuntoVisual;Pto2:TPuntoVisual);
Var
distXpixel,distYpixel:Double;
distXmm,distYmm:Double;
Begin
distXpixel := deltaPixels(pto1.x,pto2.x); // Distancia horizontal
distYpixel := deltaPixels(pto1.y,pto2.y); // Distancia vertical
//Paso a mm esas distancias
distXmm := PixelHorizToMM(distXpixel);
distYmm := PixelVertiToMM(distYpixel);
//DistPixel, Distmm, FactorEscala son
propiedades de TCmdCalcEscala
DistPixels := distancia(distXpixel,distYpixel);
Distmm := distancia(distXmm,distYmm);
FactorEscala := Distmm/DistPixels;
End;
No verifiqué si depende de la resolución, pero es de esperar que asi sea ya que los pixeles por pulgada están en proporción a la letra de la fuente.
Nota: el handler es el Canvas del objeto imagen TImage, pero podría ser la pantalla, y para ello usamos la función API GetDC , nos devuelve el handler al dispositivo para el área de cliente de la ventana especificada.
No hay comentarios.:
Publicar un comentario