2017-09-06 15 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ストリームをスキャン(2バイト長でFFDB-続い)と値を抽出することは簡単なことです。

この情報を取得するために画像をデコードする必要はありません。

+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=""; 
     } 
    } 

} 
関連する問題