/*************************************************************************************************************************************/
/* */
/* C O M P R E S S I O N / D E C O M P R E S S I O N " PNG " : */
/* */
/* */
/* Author of '$xrC/CompressionDeCompressionPNG.01$vv$I' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 20131002093741). */
/* */
/*************************************************************************************************************************************/
#include "CompressionDeCompression.01.vv.I"
#include <png.h>
#define COMPRESSION_PNG_DU_FICHIER_R \
{ \
int dimensionX=dimX; \
int dimensionY=dimY; \
/* Les images '$TypeBit__' seront considerees comme des images '$TypeOctet', mais avec une */ \
/* dimension en 'Y' 8 fois moindre. Ceci a ete mis en place le 20131017105351 car, d'une */ \
/* part le '$TypeBit__' posait un probleme de decompression et d'autre part, les autres */ \
/* compresseurs/decompresseurs utilises travaillent eux-aussi avec comme unite d'information */ \
/* l'octet... */ \
\
TypeImage *ImageACompacter=malloc(DimImages); \
\
png_structp StructureImage; \
png_infop StructureInformations; \
int NombreDeBitsParPoint=NBITOC; \
\
size_t NombreDOctetsLus=fread(ImageACompacter,1,longueur,DescripteurFichierA); \
/* Introduit le 20131014101526 a cause de 'v $xrC/EffectuerCompilations.01$vv$Z OpTiOnS' */ \
/* dans le cas ou une optimisation est demandee... */ \
\
if (longueur < DimImages) \
{ \
dimensionY=dimY/NBITOC; \
\
if ((dimensionY*NBITOC) != dimY) \
{ \
fprintf(stderr,"La dimension en 'Y' n'est pas divisible par %d.\n",NBITOC); \
} \
else \
{ \
} \
} \
else \
{ \
} \
\
StructureImage = png_create_write_struct(PNG_LIBPNG_VER_STRING,(png_voidp)PointeurNULL,PointeurNULL,PointeurNULL); \
if (StructureImage == PointeurNULL) \
{ \
fprintf(stderr,"La structure d'ecriture 'PNG' n'a pu etre creee.\n"); \
exit(NOK); \
} \
else \
{ \
} \
\
StructureInformations = png_create_info_struct(StructureImage); \
if (StructureInformations == PointeurNULL) \
{ \
fprintf(stderr,"La structure d'informations 'PNG' n'a pu etre creee.\n"); \
exit(NOK); \
} \
else \
{ \
} \
\
if (setjmp(png_jmpbuf(StructureImage))) \
{ \
fprintf(stderr,"Erreur 'PNG'.\n"); \
exit(NOK); \
} \
else \
{ \
} \
\
png_init_io(StructureImage,DescripteurFichierR); \
png_set_compression_level(StructureImage,Z_BEST_COMPRESSION); \
png_set_IHDR(StructureImage \
,StructureInformations \
,dimensionX \
,dimensionY \
,NombreDeBitsParPoint \
,PNG_COLOR_TYPE_GRAY \
,PNG_INTERLACE_NONE \
,PNG_COMPRESSION_TYPE_DEFAULT \
,PNG_FILTER_TYPE_DEFAULT \
); \
\
png_write_info(StructureImage,StructureInformations); \
\
for (y=0 ; y < dimensionY ; y++) \
{ \
png_write_row(StructureImage,(png_bytep)(ImageACompacter+(dimensionX*y))); \
} \
\
png_write_end(StructureImage,StructureInformations); \
\
png_destroy_write_struct(&StructureImage,&StructureInformations); \
\
free(ImageACompacter); \
}
FILE *DescripteurFichier;
/* Ce descripteur de fichier intermediaire est rendu necessaire a cause de la fonction */
/* 'png_read(...)' qui suit, alors que 'DescripteurFichierA' n'a pas encore ete defini... */
void png_read(png_struct *png,png_byte *donnees,png_size_t longueur)
{
ssize_t NombreDOctetsLus=read(fileno(DescripteurFichier),donnees,longueur);
/* Introduit le 20131014101526 a cause de 'v $xrC/EffectuerCompilations.01$vv$Z OpTiOnS' */
/* dans le cas ou une optimisation est demandee... */
}
#define DECOMPRESSION_PNG_DU_FICHIER_R \
{ \
TypeImage *ImageDecompactee=malloc(DimImages); \
\
long int DimensionImageEffective=DimImages; \
\
\
\
{ \
png_struct *StructureImage=png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); \
png_info *StructureInformations=png_create_info_struct(StructureImage); \
\
{ \
struct stat StatistiquesFichierA; \
DescripteurFichier=DescripteurFichierA; \
png_set_read_fn(StructureImage,0,png_read); \
fstat(fileno(DescripteurFichierA),&StatistiquesFichierA); \
png_read_info(StructureImage,StructureInformations); \
\
{ \
int dimXc=png_get_image_width(StructureImage,StructureInformations); \
int dimYc=png_get_image_height(StructureImage,StructureInformations); \
int NombreDeCanaux=png_get_channels(StructureImage,StructureInformations); \
int NombreDeBitsParPoint=png_get_bit_depth(StructureImage \
,StructureInformations \
); \
png_byte **ligne=malloc(sizeof(*ligne)*dimYc); \
\
if (dimXc != dimX) \
{ \
fprintf(stderr,"Les dimensions en 'X' de l'image sont incorrectes.\n"); \
exit(NOK); \
} \
else \
{ \
} \
\
if ((dimYc != dimY) && (dimYc != (dimY/NBITOC))) \
{ \
fprintf(stderr,"Les dimensions en 'Y' de l'image sont incorrectes.\n"); \
exit(NOK); \
} \
else \
{ \
} \
\
if (NombreDeCanaux != 1) \
{ \
fprintf(stderr,"L'image n'est pas en fausses couleurs.\n"); \
exit(NOK); \
} \
else \
{ \
} \
\
for (y=0 ; y < dimYc ; y++) \
{ \
ligne[y]=ImageDecompactee+(dimXc*y*NombreDeCanaux); \
} \
\
png_read_image(StructureImage,(png_byte**)ligne); \
\
if (dimYc == (dimY/NBITOC)) \
{ \
DimensionImageEffective=(DimensionImageEffective/NBITOC); \
} \
else \
{ \
} \
\
fwrite(ImageDecompactee,1,DimensionImageEffective,DescripteurFichierR); \
} \
} \
} \
\
free(ImageDecompactee); \
}