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.
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
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 );
Jusqu'ici tout va bien, la compilation fonctionne parfaitement.
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();
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:
Et voici l'image affichee sur mon interface Qt avec le code ci-dessus:
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 ?
Partager