2017-09-06 9 views
0

C#에서 JPG 파일의 양자화 행렬을 추출 할 수 있습니까? libjpeg.NET을 찾았지만 QT 매트릭스를 검색하는 방법을 알 수는 없습니다. 제 코드를 찾으십시오. 방금 양자화 테이블 (및 아무것도를) 원하는 경우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

감사합니다 @ 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=""; 
     } 
    } 

}