是否可以在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
}
}
}
答案 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="";
}
}
}