PDA

Ver la Versión Completa : No puedo ajustar una imagen a un tamaño de papel correctamente


aguml
23-09-2015, 17:03:02
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:
#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 > 0 || 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 (http://vivid-report-free-for-c-plus-plus-builder-6.soft112.com/) ¿ 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:
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:
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:
float porcentaje = 100, porcentajeX, porcentajeY;

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
Lo he solucionado asi:...
Recién entro, me alegra que ya hayas encontrado la solución ^\||/

Saludos :)