2017-09-06 3 views
0

Est-il possible d'extraire les matrices de quantification d'un fichier JPG en C#? J'ai trouvé le libjpeg.NET mais je ne peux pas comprendre comment récupérer les matrices de QTs. Veuillez trouver ci-dessous mon code.Comment extraire des matrices de quantification à partir d'un JPEG en C#

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  
     } 
    } 
} 

Répondre

1

Si vous voulez juste les tables de quantification (et rien d'autre), il est une simple question pour analyser le flux JPEG pour le marqueur DQT (FFDB-suivi d'une longueur de 2 octets) et extraire les valeurs.

Vous n'avez pas besoin de décoder l'image pour obtenir cette information.

+0

merci @ user3344003. Je suis nouveau au traitement du flux JPEG. Pouvez-vous poster un exemple de code s'il vous plaît? – Nic

+0

Si vous répondez avec du code, je l'accepterai! – Nic

0

Grâce à la suggestion de @ user3344003, j'ai réussi à lire l'en-tête JPEG pour extraire les informations de la matrice de quantification. J'ai suivi la spécification de disposition de fichier présentée dans 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=""; 
     } 
    } 

}