[C] Conversion de JPEG en TIFF
Résolu
Sri Lumpa
Messages postés
177
Statut
Membre
-
Sri Lumpa Messages postés 177 Statut Membre -
Sri Lumpa Messages postés 177 Statut Membre -
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) :
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:
- [C] Conversion de JPEG en TIFF
- Hevc to jpeg - Guide
- Télécharger jpeg - Télécharger - Photo & Graphisme
- Conversion bytes en mo - Forum Réseau
- 2k€ conversion - Forum Logiciels
- Conversion mb en go ✓ - Forum Mail