2 pièce(s) jointe(s)
Affichage d'une image TIFF
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:
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:
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:
Pièce jointe 166682
Et voici l'image affichee sur mon interface Qt avec le code ci-dessus:
Pièce jointe 166683
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 ?