Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   No puedo ajustar una imagen a un tamaño de papel correctamente (https://www.clubdelphi.com/foros/showthread.php?t=89079)

aguml 23-09-2015 17:03:02

No puedo ajustar una imagen a un tamaño de papel correctamente
 
Pues este proyecto es antiguo y lo estoy modificando porque me di cuenta que no ajusta bien el tamaño. Lo he solucionado poniendo el codigo dentro de un bucle do...while pero creo que deberia funcionar bien a la primera y no veo la manera.
Aqui el codigo:
Código PHP:

#define MAXHEIGHTA5 745  //Alto maximo para imprimir en A5
#define MAXWIDTHA5 524   //Ancho maximo para imprimir en A5
#define MAXHEIGHTA4 1080 //Alto maximo para imprimir en A4
#define MAXWIDTHA4 745   //Ancho maximo para imprimir en A4
#define MAXHEIGHTA3 1537 //Alto maximo para imprimir en A3
#define MAXWIDTHA3 1040  //Ancho maximo para imprimir en A3

      
int deltay;
      
int deltax;
      
float porcentaje 100;

      do{
         switch(
VividReport1->PaperSize)
         {
            case 
A5:
               
deltay CurrentImage->Picture->Bitmap->Height MAXHEIGHTA5;
               
deltax CurrentImage->Picture->Bitmap->Width MAXWIDTHA5;
               break;

            case 
A4:
               
deltay CurrentImage->Picture->Bitmap->Height MAXHEIGHTA4;
               
deltax CurrentImage->Picture->Bitmap->Width MAXWIDTHA4;
               break;

            case 
A3:
               
deltay CurrentImage->Picture->Bitmap->Height MAXHEIGHTA3;
               
deltax CurrentImage->Picture->Bitmap->Width MAXWIDTHA3;
               break;
         }

         
//Averiguamos el ancho y alto apropiados para la imagen
         
if(deltay deltax && deltay 0)
         {
            
porcentaje = (100.0 maxHeight) / CurrentImage->Picture->Bitmap->Height;
         }
         else if((
deltay deltax || deltay == deltax) && deltax 0)
         {
            
porcentaje = (100.0 maxWidth) / CurrentImage->Picture->Bitmap->Width;
         }

         if(
porcentaje 100)
         {
            
CurrentImage->Picture->Bitmap->Width -= ((CurrentImage->Picture->Bitmap->Width - (CurrentImage->Picture->Bitmap->Width porcentaje 100)));
            
CurrentImage->Picture->Bitmap->Height -= ((CurrentImage->Picture->Bitmap->Height - (CurrentImage->Picture->Bitmap->Height porcentaje 100)));
         }
      }while(
deltax || deltay 0); 

La idea es quitar el do...while y que se ajuste a la primera. ¿Alguien puede ayudarme?

ecfisa 23-09-2015 17:39:41

Hola aguml.

No lo comentas, pero leyendo el código parece que la impresión la haces por medio de Vivid Report ¿ Es correcto ?

Saludos :)

aguml 24-09-2015 00:48:55

Pues si, lo que pasa es que no lo indiqué porque pienso que para el código que puse no es importante pero igual me equivoco y me sorprendes.
Lo que intento hacer es lo siguiente:
1-Obtengo el tamaño del papel.
2-Abro la imagen en el contenedor y obtengo el ancho y el alto.
3-la idea es saber a cual de los dos se le tiene que aplicar un mayor porcentaje de reducción para que quepa en la página.
4-Le aplicó el mayor porcentaje a ambos para que la imagen quepa sin perder la proporcionalidad.

Pues no se que falla que no siempre funciona.

ecfisa 24-09-2015 03:41:17

Hola aguml.

Estoy intentando reproducir el código para ver el comportamiento, pero me encuentro con que me faltan unos datos ¿ Que representan y que valores toman las variables maxHeight y maxWidth ?

La pregunta sobre el reporter es debida a que, si el código da correctamente los valores de ajuste, el problema podría estar generado por alguna particularidad de ese reporter (que recién hoy conocí).

Saludos :)

aguml 24-09-2015 08:47:44

Esas dos variables tiene el valor de MAXHEIGHT y MAXWIDTH para el tamaño de papel de la impresión. Osea, si el papel es A4, MAXHEIGHT será igual a MAXHEIGHT A4 y maxWidth será igual a MAXWIDTHA4.

aguml 24-09-2015 09:14:33

He estado haciendo cálculos con el móvil y he llegado a la conclusión de que estas lineas:
Código PHP:

 CurrentImage->Picture->Bitmap->Width -= ((CurrentImage->Picture->Bitmap->Width - (CurrentImage->Picture->Bitmap->Width porcentaje 100)));
 
CurrentImage->Picture->Bitmap->Height -= ((CurrentImage->Picture->Bitmap->Height - (CurrentImage->Picture->Bitmap->Height porcentaje 100))); 

Tienen que ser asi:
Código PHP:

 CurrentImage->Picture->Bitmap->Width  CurrentImage->Picture->Bitmap->Width porcentaje 100;
 
CurrentImage->Picture->Bitmap->Height CurrentImage->Picture->Bitmap->Height porcentaje 100

Aunque no creo que influya ya que como estaba lo que hacía era calcular el tamaño final y se lo restaba al tamaño real y me daba lo que tenia que quitarle al tamaño real así que se lo quitaba. Entonces repasando paso a paso me dije "si en el primer calculo ya tengo el tamaño final ¿para que más cuentas? ". Tengo que probarlo pero no creo que influya en el resultado.
Lo que pienso es que en vez de usar los deltas debería de calcular ambos porcentajes y el porcentaje más pequeño es el que tendría que utilizar. Luego lo pruebo a ver que tal.

aguml 24-09-2015 11:23:18

Lo he solucionado asi:
Código PHP:

      float porcentaje 100porcentajeXporcentajeY;

      
porcentajeX maxWidth 100.0 CurrentImage->Picture->Bitmap->Width;
      
porcentajeY maxHeight 100.0 CurrentImage->Picture->Bitmap->Height;

      
//Averiguamos el ancho y alto apropiados para la imagen
      
if((porcentajeY porcentajeX || porcentajeY == porcentajeX) && porcentajeY 0)
      {
         
porcentaje porcentajeY;
      }
      else if(
porcentajeY porcentajeX && porcentajeX 0)
      {
         
porcentaje porcentajeX;
      }

      if(
porcentaje 100)
      {
         
CurrentImage->Picture->Bitmap->Width CurrentImage->Picture->Bitmap->Width porcentaje 100;
         
CurrentImage->Picture->Bitmap->Height CurrentImage->Picture->Bitmap->Height porcentaje 100;
      } 

Adios a los deltas jejeje.

ecfisa 24-09-2015 14:45:33

Cita:

Empezado por aguml (Mensaje 497113)
Lo he solucionado asi:...

Recién entro, me alegra que ya hayas encontrado la solución ^\||/

Saludos :)


La franja horaria es GMT +2. Ahora son las 09:01:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi