Je suis en train de développer l'uploader d'images pour Flash 10. Y at-il un moyen de lire la qualité JPEG des images parcourues.ActionScript 3 Lire la qualité JPEG
Répondre
Malheureusement, il ne peut se faire directement:
Le facteur de qualité ne sont pas stockées directement dans le fichier JPEG, de sorte que vous ne pouvez pas lire le facteur de qualité de le fichier. (à partir de: Microsoft support pages ...)
De façon plus détaillée:
Le tableau de quantification qui a été utilisé pour compresser une image est stockée dans l'en-tête de JFIF, mais la qualité JPEG Le facteur qui a été utilisé pour générer la table de quantification n'est pas stocké le long de avec l'image et par conséquent, le facteur de qualité JPEG d'origine est perdu. (à partir de: JPEG Compression Metrics as a Quality Aware Image Transcoding, par Surendar Chandra et Carla Schlatter Ellis)
La citation ci-dessus est à partir d'un document qui décrit des moyens de estimer le niveau de compression (en examinant les tables de quantification utilisées dans l'image) , mais il ne semble pas facile à mettre en œuvre: il y a un exemple here qui fait partie de la Image Magick codebase, mais il est écrit en C.
image Magick a été ported-Haxe, qui peut être respecté dans le code flash, donc on peut penser que vous pourriez avoir quelque chose qui fonctionne, mais j'ai peur que ce soit au-delà de mes compétences pour expliquer comment!
EDIT: vient de trouver un similar question sur SuperUser, qui mentionne aussi Image Magick.
EDIT: vous pourriez être également intéressé par les réponses à this question, qui a demandé comment obtenir la taille d'une image sans charger le fichier entier (bon pour traiter des images plus grandes que Flash peut gérer).
J'ai utilisé le libjpeg pour terminer ce travail, peut-être vous pouvez vous référer à mon code
#include <stdio.h>
#include <math.h>
#include "jpeglib.h"
#include <setjmp.h>
static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68, 109, 103, 77,
24, 35, 55, 64, 81, 104, 113, 92,
49, 64, 78, 87, 103, 121, 120, 101,
72, 92, 95, 98, 112, 100, 103, 99
};
int ReadJpegQuality(const char *filename)
{
FILE * infile = fopen(filename, "rb");
fseek(infile,0,SEEK_END);
size_t sz = ftell(infile);
fseek(infile,0,SEEK_SET);
unsigned char* buffer = new unsigned char[sz];
fread(buffer,1,sz,infile);
fclose(infile);
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_mem_src(&cinfo,(unsigned char*)buffer,sz);
jpeg_read_header(&cinfo, TRUE);
int tmp_quality = 0;
int linear_quality = 0;
const int aver_times = 3;
int times = 0;
int aver_quality = 0;
for(int i=0;i<DCTSIZE2;i++)
{
long temp = cinfo.quant_tbl_ptrs[0]->quantval[i];
if(temp<32767L&&temp>0)
{
linear_quality = ceil((float)(temp*100L - 50L)/std_luminance_quant_tbl[i]);
if(linear_quality==1) tmp_quality = 1;
else if(linear_quality==100) tmp_quality = 100;
else if(linear_quality>100)
{
tmp_quality = ceil((float)5000/linear_quality);
}
else
{
tmp_quality = 100 - ceil((float)linear_quality/2);
}
aver_quality += tmp_quality;
if(aver_times==++times)
{
aver_quality /= aver_times;
break;
}
}
}
jpeg_destroy_decompress(&cinfo);
return aver_quality;
}
int main(int argc,char** argv)
{
printf("quality: %d\n",ReadJpegQuality("test1.jpg"));
return 0;
}
cette méthode utilise le libjpeg pour lire la table de quantification de fichier jpg, puis utilisez la table de quantification calculer les arguments de qualité .