Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Relacion para obtener el tamaño del papel (https://www.clubdelphi.com/foros/showthread.php?t=87359)

aguml 19-12-2014 21:14:44

Relacion para obtener el tamaño del papel
 
Pues eso, que segun la Wikipedia he podido obtener los tamaños mas genericos de papel y los da en mm y para imprimir usando C++Builder tengo estos valores y van bien:

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 

y segun la wikipedia:
Código:

B3 = 353mm x 500mm
B4 = 250mm x 353mm
B5 = 176mm x 250mm

segun mis calculos tengo esta relacion de aspecto:

A5:
Código:

Alto: 3,547619047619047619047619047619
Ancho: 3,547619047619047619047619047619

A4:
Código:

Alto: 3,6363636363636363636363636363636
Ancho: 3,547619047619047619047619047619

A3:
Código:

Alto: 3,6595238095238095238095238095238
Ancho: 3,5016835016835016835016835016835

Mi pregunta es ¿en que se basa esa relacion y cual es la relacion correcta para calcular todas correctamente?

aguml 19-12-2014 21:33:04

Segun he leido por ahi eso depende de la resolucion de pantalla y que con esto se obtiene los pixeles por pulgadas:
Código PHP:

int ppx= GetDeviceCaps(Printer()->Handle, LOGPIXELSX);
int ppy= GetDeviceCaps(Printer()->Handle, LOGPIXELSY); 

El caso es que he cambiado la resolucion de pantalla por todas las que me permite el pc y los valores de ppx y ppy siempre son 360.
Estoy totalmente perdido, lo que quiero es imprimir un BMP, JPG, o GIF en los diferentes tamaños de papel y saber de antemano si la imagen cabe o no sin redimensionarla para saber si dividirla en varios folios o no.

aguml 23-12-2014 14:31:11

Buscando info leí que para saber la relacion hay que tener dos valores: relacion en pixeles por pulgada de la imagen, y ancho/alto imagen.
Lo primero era saber los ppp del bmp usando codigo puro y duro. Para ello busqué más información y pude obtener esto:

Código PHP:

bool LoadPPPBMP ( int* width, int* height, long* resH, long* resV, char *bmpfile )
{
   
BITMAPFILEHEADER bmpheader;
   
BITMAPINFOHEADER bmpinfo;
   
DWORD bytesread;

   
HANDLE file = CreateFile ( bmpfile , GENERIC_READ, FILE_SHARE_READ,
         
NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL );
   if ( 
NULL == file )
        return 
false;

   if ( 
ReadFile ( file, &bmpheader, sizeof ( BITMAPFILEHEADER ),
        &
bytesread, NULL ) == false )
   {
        
CloseHandle ( file );
        return 
false;
   }

   if ( 
ReadFile ( file, &bmpinfo, sizeof ( BITMAPINFOHEADER ),
        &
bytesread, NULL ) == false )
   {
        
CloseHandle ( file );
        return 
false;
   }

   if ( 
bmpheader.bfType != 'MB' )
   {
        
CloseHandle ( file );
        return 
false;
   }

   *
width   = bmpinfo.biWidth;
   *
height  = abs ( bmpinfo.biHeight );
   *
resH = bmpinfo.biXPelsPerMeter;
   *
resV = bmpinfo.biYPelsPerMeter;

   
CloseHandle ( file );
   return 
true;
} 

Con esa funcion obtengo los pixeles por metro y necesito los pixeles por pulgadas y para ello hago esto:

Código PHP:

void __fastcall TForm2::ObtenerDimensionesPapel(int &maxHeight, int &maxWidth, char* path)
{   
   
int x, y;
   
long resH, resV;
   
bool retval = LoadPPPBMP ( &x, &y, &resH, &resV, path);

   
//Para calcular los pixeles por pulgadas (ppp) resX y resV tienen el valor de relacion en pixeles por metro
   //asi que multiplico el valor de una pulgada entre 100 y multiplico el resultado por el valor en ppm
   
int pppX = resH * (2.54 / 100);
   
int pppY = resV * (2.54 / 100);

   
//En VividReport1->PageUHeight y PageUWidth está el tamaño del papel en mms y lo 
   //divido entre 10 para pasarlo a cms
   
maxHeight = (VividReport1->PageUHeight / 10) * pppX / 2.54;
   
maxWidth = (VividReport1->PageUWidth / 10) * pppY / 2.54;
} 

Una vez he obtenido los ppp ya se ve como obtengo la relacion y obtengo correctamente los ppp pero la relacion no me da lo que deviese ya que por ejemplo para maxHeight en A4 me da unos 1100 haciendo pruebas pero con las funciones obtengo unos 595.27. Si pongo al componente VividReport1 para que trabaje con la unidad Points me pone en PageUHeight justo ese valor y el ancho tambien coincide ¿que hago mal? Esto me tiene loco.
Os pongo los enlaces que me han ayudado a comprender un poco este lio.
Obtener info del header del bmp: http://tipsandtricks.runicsoft.com/C...pTutorial.html
Obtener formula para relacion: http://www.digitalfotored.com/imagen...tospulgada.htm


La franja horaria es GMT +2. Ahora son las 23:20:31.

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