我正在开发Flash 10的图像上传器吗?有没有办法读取浏览图像的JPEG质量。ActionScript 3读取JPEG质量
2
A
回答
1
不幸的是,它不能直接完成:
品质因数不直接存储 在JPEG文件,所以你 无法从 文件中读取的品质因数。 (来自:Microsoft support页...)
更详细地:
在于使用 压缩存储在 的JFIF报头中的图像的量化表,但JPEG质量 用于生成 量化表的因子不会沿着图像 存储,因此原始 JPEG品质因数将丢失。 (从:JPEG Compression Metrics as a Quality Aware Image Transcoding,通过Surendar钱德拉和卡拉施拉特埃利斯)
以上报价是由纸,其中讨论的方法来估计压缩的水平(通过检查在图像中使用的量化表) ,但它看起来并不容易实现:有一个例子here这是Image Magick代码库的一部分,但它是用C写的
难懂的一直ported到Haxe,它可以编译成Flash程序,所以可以想象,你可以得到一些工作,但是我恐怕解释不了我的技能!
编辑:刚刚在SuperUser上发现了一个similar question,它也提到了Image Magick。
编辑:您可能也有兴趣在回答this question,其中问到如何获得图像的大小,而无需加载整个文件(适用于处理大于闪存能够处理图像)。
0
我已经使用了libjpeg的完成这项工作,也许你可以参考我的代码
#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;
}
这种方法是使用libjpeg的读取JPG文件的量化表,然后使用量化表计算出的质量参数。
相关问题
- 1. Java图像质量(JPEG)
- 2. JPEG图像像素质量
- 3. 排名的JPEG质量
- 4. ImageMagick的JPEG质量极低
- 5. php Gmagick保存jpeg质量
- 6. 的ActionScript JPGEncoder +质量差
- 7. 简单的ActionScript 3从PHP读取JSON
- 8. 读取XML节点使用ActionScript 3
- 9. Actionscript 3读取响应内容类型
- 10. 从PHP中的SWF读取ActionScript 3常量
- 11. 上的ActionScript更改质地2/3
- 12. c#:在以100%质量保存JPEG时降低图像质量
- 13. Actionscript 3 - 设置个别动画片段的质量
- 14. JPEG页脚读取
- 15. TWICImage,如何设置jpeg压缩质量?
- 16. PHP JPEG裁剪:质量损失?
- 17. 回形针:指定jpeg/jpg质量
- 18. 获取ActionScript的3
- 19. 在actionscript 2.0中读取全局变量
- 20. ActionScript读取矢量的数据类型?
- 21. 动态变量名 - Actionscript 3
- 22. Actionscript 3绑定变量
- 23. 读取JPEG文件perl
- 24. RMagick返回nil读取JPEG
- 25. 用actionscript提取xml cdata 3
- 26. Pascal - 读取/读取函数杂质?
- 27. Actionscript 2与Actionscript 3
- 28. actionscript 2 to actionscript 3
- 29. Actionscript 3矢量数不扩展矢量*
- 30. 用Ventrilo钩Flash ActionScript中读3