[C] Conversion de JPEG en TIFF

Résolu/Fermé
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 - 9 juil. 2008 à 16:42
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 - 9 juil. 2008 à 17:08
Bonjour,

Je cherche à développer un petit code rapide en C pour convertir des images JPEG en images TIFF. Le code fonctionne à part un petit détail... En gros, le fichier de sortie fait la bonne résolution, mais l'image en elle même est comprimée d'environ 30% en largeur (elle ne fait qu'un tiers de la largeur attendue et le reste de l'image est noir). De plus l'image de sortie prends 3 fois plus d'espace qu'elle ne devrait. Je pense que je me plante quelque part dans l'initialisation des TIFFTAG mais je n'arrive pas à voir où. Si quelqu'un arrive à me débloquer, ça m'arrangerait pas mal...

Voici mon code (Désolé, il est hyper crade :s) :
#include <stdio.h>
#include <stdlib.h>
#include <tiff.h>
#include <tiffio.h>
#include <jpeglib.h>
#include <jerror.h>

int main(int argc, char* argv[])
{
	unsigned char *ligne;
	unsigned char *image;
	
	TIFF* out;
	struct jpeg_decompress_struct in;
	struct jpeg_error_mgr jerr;
	FILE *file;
	unsigned char * buf;
	tsize_t linebytes;
	int x, y, i, j, x_max, y_max, sampleperpixel, bitpersample;
	
	if(argc != 3){
		fprintf(stdout, "<use>./tiff2jpeg inner_file outer_file");
		return 0;
	}
	
	//Creation des struct jpeg
	in.err = jpeg_std_error(&jerr);;
	jpeg_create_decompress(&in);
	
	//Ouverture du fichier JPEG
	printf("ouverture des fichiers\n");
	file = fopen(argv[1], "r");
	
	//définition de la source pour l'image jpeg
	jpeg_stdio_src(&in, file);
	jpeg_read_header(&in, 1);
	
        // récupération des infos relatives à l'image source
	x_max = in.image_width;
	y_max = in.image_height;
	sampleperpixel = /*in.output_components;*/ 3; // output_components semble toujours valoir 0
	
	printf("largeur %d hauteur %d components %d\n", x_max, y_max, sampleperpixel);
	
	image = (unsigned char*)malloc(y_max*x_max*sizeof(int));
	ligne = image;

	// Débute de la décompression
	jpeg_start_decompress(&in);
	while(in.output_scanline < y_max){
		ligne = image+3*x_max*(y_max-in.output_scanline);
		jpeg_read_scanlines(&in, &ligne, 1);
	}
	jpeg_finish_decompress(&in);
	jpeg_destroy_decompress(&in);
	//Décompression terminée
	
	//Ouverture fichier TIFF
	
	out = TIFFOpen(argv[2], "w");

	// Définition des champs TIFF
	
	bitpersample = 8;
	
	linebytes = sampleperpixel * x_max;
	
	TIFFSetField(out, TIFFTAG_IMAGEWIDTH, x_max);
	TIFFSetField(out, TIFFTAG_IMAGELENGTH, y_max);
	TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, sampleperpixel);
	TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bitpersample);
	TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
	TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
	TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
	TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, linebytes));

	//initialisation du buffer tiff
	buf =(unsigned char *)_TIFFmalloc(linebytes);
	for(y = 0 ; y < y_max ; y++){
		buf = (image+linebytes*(y_max-1-y));
		if(TIFFWriteScanline(out, buf, y, 0) < 0) printf("plantage ligne %d\n", y);;
	}

	//Ecriture dans le fichier TIFF terminée
	TIFFClose(out);
	_TIFFfree(buf);
	printf("buffer tiff supprimé\n");
	//free(image);
	
	return 0;	
}
A voir également:

1 réponse

Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 68
9 juil. 2008 à 17:08
Pfff... Je suis un véritable boulet... Comme je traite des images en niveau de gris, je devais régler TIFFTAG_PHOTOMETRIC à PHOTOMETRIC_MINISBLACK et non pas à PHOTOMETRIC_RGB ><"
1