如何在C#中从JPEG中提取量化矩阵

时间:2017-09-06 10:20:23

标签: c# jpeg libjpeg

是否可以在C#中提取JPG文件的量化矩阵?我找到了libjpeg.NET,但我无法弄清楚如何检索QTs矩阵。请在下面找到我的代码。

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

2 个答案:

答案 0 :(得分:1)

如果您只想要量化表(没有其他内容),扫描JPEG流以获取DQT标记(FFDB - 后跟2字节长度)并提取值是一件简单的事情。

您无需解码图像即可获取此信息。

答案 1 :(得分: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="";
        }
    }

}