Bonjour,

Mon application doit lire un fichier de type TIFF et afficher son contenu dans un QLabel.

Facile vous allez me dire, mais Qt ne supporte pas (encore) les fichiers TIFF a multi-page.

Donc, je fais appel a libTIFF pour la lecture du TIFF. L'idee est donc de lire le fhcier TIFF, separer les pages en les stoquant dans un conteneur, et iterer dessus pour afficher image par image.

Voici la partie du code utilisant libTIFF, qui lit le fichier TIFF.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
#include "tiffio.h"
 
 
TIFF* f_tiff;
unsigned int width;
unsigned int height;
unsigned short depth;
unsigned short samples_per_pixel;
unsigned short photo_metric;
int total_pages;
 
//ici on stoque les differentes pages
std::vector< unsigned char* > _pages;
 
f_tiff = TIFFOpen( input_file.c_str(), "r" );
//on suppose que le fichier est bien ouvert
 
TIFFGetField( f_tiff, TIFFTAG_IMAGEWIDTH, &width );
TIFFGetField( f_tiff, TIFFTAG_IMAGELENGTH, &height );
TIFFGetField( f_tiff, TIFFTAG_BITSPERSAMPLE, &depth );
TIFFGetField( f_tiff, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel );
TIFFGetField( f_tiff, TIFFTAG_PHOTOMETRIC, &photo_metric );
 
total_pages = 0;
 
//Pour chaque page
do{
     total_pages++;
 
     //tampon pour stoquer la page actuelle
     unsigned char* in_image = (unsigned char*) _TIFFmalloc( width * height );
 
     if( in_image == NULL )
         log( "Could not allocate memory!" );
     else
     {
         int check_io;
         unsigned int row;
 
         //lire ligne par ligne de la page actuelle
         for( row = 0; row < height; row++ )
         {
              check_io = TIFFReadScanline( f_tiff, &in_image[ row * width ], row, 1 );
              if( check_io != 1 )
                  log( "ERROR IO" );
         }
 
         //la lecture de la page est terminee, on la stoque dans le conteneur
         _pages.push_back( in_image );
     }
 
}
while( TIFFReadDirectory( f_tiff ) ); //Pour chaque paqe
 
TIFFClose( f_tiff );
Maintenant pour simplifier, nous allons afficher la toute premiere page sur un QLabel, nomme label_fax.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
//Pointeur sur la premiere page
unsigned char* raw = _pages[ 0 ];
 
//On sait d'avance que le fichier TIFF qu'on veut afficher est code sur 1bit (noir ou blan) donc on cree la QImage avec un format Mono (voir doc Qt)
QImage image( width, height, QImage::Format_Mono );
 
for( unsigned int y(0); y < height; ++y )
{
    for( unsigned int x(0); x < width; ++x )
    {
        int index( y * width + x );
        unsigned char pix = raw[ index ];
        image.setPixel( x, y, pix );
     }
}
label_fax.setPixmap( QPixmap::fromImage( image ) ); 
label_fax.show();
Jusqu'ici tout va bien, la compilation fonctionne parfaitement.

Le systeme de gestion des pages fonctionne egalement.

Le probleme, dont je cherche a resoudre, est l'affichage de l'image.

Voici l'image originale:

Nom : fax_0.jpg
Affichages : 890
Taille : 366,3 Ko

Et voici l'image affichee sur mon interface Qt avec le code ci-dessus:

Nom : fax_1.jpg
Affichages : 916
Taille : 122,2 Ko
On dirait que la largeur est deformee...

Je n'arrive pas a trouver ce qui peut causer ceci ( j'y travaille depuis mardi ! ).

P.S. Les tags width, height etc sont corrects.

Avez vous une idee ? Une piste ?