Rechercher : dans
Par :

[C] Conversion de JPEG en TIFF

Dernière réponse le 9 jui 2008 à 17:08:34 Sri Lumpa, le 9 jui 2008 à 16:42:31 
 Signaler ce message aux modérateurs

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;	
}
Au commencement, nous sommes tous des noobs...
Configuration: Linux
Firefox 2.0.0.15

Meilleures réponses pour « [C] Conversion de JPEG en TIFF » dans :
[PDF] Convertir des PDF en images (JPEG, BMP, GIF, etc...) VoirSi vous avez des documents PDF et que vous voulez les convertir en images (JPEG, GIF, BMP, ou n'importe quel format), de manière à les exploiter, par exemple dans un logiciel d'OCR ou de retouche/création d'images : Note : Cet article présente une...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

 Sri Lumpa, le 9 jui 2008 à 17:08:34
  • +1

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 ><" Au commencement, nous sommes tous des noobs...

Répondre à Sri Lumpa