2017-09-06 108 views
0

是否有可能在C#中提取JPG文件的量化矩陣?我找到了libjpeg.NET,但我無法弄清楚如何檢索QTs矩陣。請在下面找到我的代碼。如何從C#中的JPEG中提取量化矩陣

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using BitMiracle.LibJpeg; 

namespace ConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      string file = @"PATH_TO_FILE"; 
      JpegImage img = new JpegImage(file);  
      Console.Read();    
      // Ideally, there should be some img.GetQuantizationMatrix() method  
     } 
    } 
} 

回答

1

如果你只是想量化表(沒有別的),這是一個簡單的事情,以掃描DQT標記的JPEG流(FFDB,接着是2個字節的長度),並提取值。

您無需解碼圖像即可獲取此信息。

+0

thanks @ user3344003。我是處理JPEG流的新手。你可以發佈一些示例代碼嗎? – Nic

+0

如果你回答一些代碼,我會接受它! – Nic

0

感謝@ user3344003的建議,我設法讀取JPEG標頭以提取量化矩陣信息。我遵循this web page中提供的文件佈局規範。

void Main() 
{ 
    string folder = @"PATH_TO_FILE"; 
    var files = Directory.GetFiles(folder, "*jpg", SearchOption.AllDirectories); 

    byte dqt = 0xDB; 

    foreach (string file in files) 
    { 
     file.Dump(); 

     byte[] s = File.ReadAllBytes(file); 

     for (int i = 0; i < s.Length-1; i++) { 
      byte b1 = s[i]; 
      byte b2 = s[i+1]; 

      if (b1 == 0xff && b2 == 0xdb) { 

       int field_length = s[i + 2] + s[i + 3]; 
       int matrix_length = field_length - 3; 
       int qt_info = s[i + 4]; 
       ("QT info" + qt_info).Dump(); 
       ("QT Matrix").Dump(); 
       byte[] mat = new byte[matrix_length]; 

       for (int k = 0; k < matrix_length; k++) { 
        mat[k] = s[i+5+k]; 
       } 
       Print8x8Matrix(mat);  
      } 
     } 
    } 
} 
public static void Print8x8Matrix(byte[] bytes) 
{ 
    string s = ""; 
    for (int i= 0; i < bytes.Length; i++) { 
     s += bytes[i] + " "; 
     if (i % 8 == 0) 
     { 
      s.Dump(); 
      s=""; 
     } 
    } 

}