Intentando aprender manejo de bitmap III - Pixels por mm (en delphi)
Asi funciona correctamente, medidas de ángulos, rectas, distancias, proyecciones, etc.
Después de mucho andar finalmente resolví el problema como lo hacía originalmente, ya que aparentemente la información contenida en un archivo de tipo bitmap, no tiene los datos necesarios. Conclusión: hay que crear como sea una escala para calcular la relación pixels por mm.
Pero tenía una duda, ya que para cada imagen debo guardar esas escalas, temía que éstas cambiaran al cambiar la resolución, y por lo tanto no bastaran por si sólo eso datos, sino que ademas tendría que guardar la resolución a la que se calcularon los factores, y no es así.
Mi imagen es un bitmap que está dentro de un objeto de TImage, y tanto el bitmap, y el objeto imagen (de TImage), quedan con sus propiedades Width y Height constantes independientemente de la resolución de pantalla. Por lo tanto los factores en X e Y tampoco cambian.
Esto se debe a tres cosas:
Observé la variable Screen.PixelsPerInch del form que contiene el TImage, y sin embargo su valor cambia al modificar la resolución, pero los componentes contenidos en el form no cambiarán sus dimensiones.
El código es muy sencillo, simplemente aplicar lo que dije:
Procedimiento de un controlador que calcula la escala.
Procedure TCalcHandler.calcEscala(P1:TPuntoVisual;P2:TPuntoVisual; P3:TPuntoVisual);
Begin
if ((P1 = nil) or (P2 = nil) or (P3 = nil)) then
ShowMessage('Faltan parámetros para calcular la distancia')
else
begin
// Puntos iguales
if ((P1 = P2) or (P1 = P3) or (P2 = P3)) then
ShowMessage('Hay puntos que coinciden,
la distancia es cero, no hay escala')
else
begin
imgHdl := fact.getInstanceImgHndl;
// setea imgHdl.FactorX y imgHdl.FactorY
imgHdl.setEscala(P1,P2,P3);
end;
end;
End;
distXmm, distYmm, DistPixels son todas propiedades del controlador TImgHandler.
distXmm: distancia en mm segun OX conocida en la imagen sin digitalizar.
distYmm: idem segun Oy.
Inicializa los valores de la escala.
Procedure TImgHandler.setEscala(p1,p2,p3:TPuntoVisual);
Begin
// p1,p2 forman sentido del eje Ox
// p2,p3 forman sentido del eje Oy
distEnPixels(p1,p2);
// relacion entre mm/pixel
FactorX := self.distXmm/DistPixels;
distEnPixels(p2,p3);
FactorY := self.distYmm/DistPixels;
End;
Function TImgHandler.distEnPixels(p1,p2:DTPunto):double;
Var
distP1P2:TDistanciaP1P2;
Begin
distP1P2 := TDistanciaP1P2V.Create(p1,p2);
distP1P2.Calcular;
DistPixels := distP1P2.Distancia;
distEnPixels := DistPixels
End;
Function TDistanciaP1P2V.Calcular:Integer;
Var
deltaX,deltaY:Double;
Begin
//P1, P2 ya fueron pasados al crear el objeto
deltaX := P2.X - P1.X;
deltaY := P2.Y - P1.Y;
Calcular := Sqrt(sqr(deltaX) + sqr(deltaY));
End;
No hay comentarios.:
Publicar un comentario