我正在開發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