[C] Conversion de JPEG en TIFF

Résolu
Sri Lumpa Messages postés 177 Date d'inscription   Statut Membre Dernière intervention   -  
Sri Lumpa Messages postés 177 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   69
 
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