如何使用 Visual C# 和 LibJpeg.Net 从 Jpeg 获取 DCT 系数
How to get DCT-coefficients from Jpeg using Visual C# and LibJpeg.Net
我需要在量化后获取 DCT 系数数组以进一步更改位(隐写术)。
我的问题是:比方说,我在图片框或其他地方有 jpeg 图像。我怎样才能访问 dct 系数。使用 C# 和像 LibJpeg.Net 这样的库来处理这张图片?需要代码请。在整个网络上找不到任何完整和简单的东西。另外,在 LibJpeg.Net 上看不到任何教程。
完成此步骤后:
BitMiracle.LibJpeg.Classic.jpeg_decompress_struct oJpegDecompress = new BitMiracle.LibJpeg.Classic.jpeg_decompress_struct();
System.IO.FileStream oFileStreamImage = new System.IO.FileStream(strImagePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
oJpegDecompress.jpeg_stdio_src(oFileStreamImage);
oJpegDecompress.jpeg_read_header(true);
BitMiracle.LibJpeg.Classic.jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] JBlock = oJpegDecompress.jpeg_read_coefficients();
我现在应该做什么,编辑 dct 系数?使用 .Access()
?我该如何使用它?有例子吗?
以下:
short[] block = JBlock[c].Access(x, y);
给出这样的错误:"Cannot implicitly convert type 'BitMiracle.LibJpeg.Classic.JBLOCK[][]' to 'short[]'"
此外,在使用类似的东西时,它给出了关于将 "BitMiracle.LibJpeg.Classic.JBLOCK[][]" 转换为类型 "System.IConvertible" 的错误。
或者有人知道解决我的问题的另一种简单方法?
我在编写 JPEG 库时已完成此操作以验证其正确性。您只需要获取 LIBJPEG 的源代码;确定它在哪里执行您感兴趣的功能(有点困难,因为代码很复杂);在那里设置断点或 return。
好吧,我想通了。至少,它回答了我的主要问题。
private void button1_Click(object sender, EventArgs e)
{
string path = @"D:7.jpg";
var img = new Bitmap(path);
var jo = img.Width;
var joj = img.Height;
BitMiracle.LibJpeg.Classic.jpeg_decompress_struct oJpegDecompress = new BitMiracle.LibJpeg.Classic.jpeg_decompress_struct();
System.IO.FileStream oFileStreamImage = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
oJpegDecompress.jpeg_stdio_src(oFileStreamImage);
oJpegDecompress.jpeg_read_header(true);
BitMiracle.LibJpeg.Classic.jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] JBlock = oJpegDecompress.jpeg_read_coefficients();
var ll = JBlock[0].Access(0, 1); // accessing the element
var oo = 5; // its gonna be new value for coefficient
for (int i = 0; i < 64; i++) // some cycle
{
ll[0][i][0] = Convert.ToInt16(oo); // changes
}
oJpegDecompress.jpeg_finish_decompress();
oFileStreamImage.Close();
/////
System.IO.FileStream objFileStreamMegaMap = System.IO.File.Create(@"D:8.jpg");
BitMiracle.LibJpeg.Classic.jpeg_compress_struct oJpegCompress = new BitMiracle.LibJpeg.Classic.jpeg_compress_struct();
oJpegCompress.jpeg_stdio_dest(objFileStreamMegaMap);
oJpegDecompress.jpeg_copy_critical_parameters(oJpegCompress);
oJpegCompress.Image_height = joj;
oJpegCompress.Image_width = jo;
oJpegCompress.jpeg_write_coefficients(JBlock);
oJpegCompress.jpeg_finish_compress();
objFileStreamMegaMap.Close();
oJpegDecompress.jpeg_abort_decompress();
oFileStreamImage.Close();
}
有点马虎,但是,只是测试...
使用了 here
中的一些代码
像这样,正如您在控制台中看到的那样,输出图像中 0->m_buffer->0->i 下的每个第 0 个元素将等于 5
向我致敬。
我需要在量化后获取 DCT 系数数组以进一步更改位(隐写术)。 我的问题是:比方说,我在图片框或其他地方有 jpeg 图像。我怎样才能访问 dct 系数。使用 C# 和像 LibJpeg.Net 这样的库来处理这张图片?需要代码请。在整个网络上找不到任何完整和简单的东西。另外,在 LibJpeg.Net 上看不到任何教程。
完成此步骤后:
BitMiracle.LibJpeg.Classic.jpeg_decompress_struct oJpegDecompress = new BitMiracle.LibJpeg.Classic.jpeg_decompress_struct();
System.IO.FileStream oFileStreamImage = new System.IO.FileStream(strImagePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
oJpegDecompress.jpeg_stdio_src(oFileStreamImage);
oJpegDecompress.jpeg_read_header(true);
BitMiracle.LibJpeg.Classic.jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] JBlock = oJpegDecompress.jpeg_read_coefficients();
我现在应该做什么,编辑 dct 系数?使用 .Access()
?我该如何使用它?有例子吗?
以下:
short[] block = JBlock[c].Access(x, y);
给出这样的错误:"Cannot implicitly convert type 'BitMiracle.LibJpeg.Classic.JBLOCK[][]' to 'short[]'"
此外,在使用类似的东西时,它给出了关于将 "BitMiracle.LibJpeg.Classic.JBLOCK[][]" 转换为类型 "System.IConvertible" 的错误。
或者有人知道解决我的问题的另一种简单方法?
我在编写 JPEG 库时已完成此操作以验证其正确性。您只需要获取 LIBJPEG 的源代码;确定它在哪里执行您感兴趣的功能(有点困难,因为代码很复杂);在那里设置断点或 return。
好吧,我想通了。至少,它回答了我的主要问题。
private void button1_Click(object sender, EventArgs e)
{
string path = @"D:7.jpg";
var img = new Bitmap(path);
var jo = img.Width;
var joj = img.Height;
BitMiracle.LibJpeg.Classic.jpeg_decompress_struct oJpegDecompress = new BitMiracle.LibJpeg.Classic.jpeg_decompress_struct();
System.IO.FileStream oFileStreamImage = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
oJpegDecompress.jpeg_stdio_src(oFileStreamImage);
oJpegDecompress.jpeg_read_header(true);
BitMiracle.LibJpeg.Classic.jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] JBlock = oJpegDecompress.jpeg_read_coefficients();
var ll = JBlock[0].Access(0, 1); // accessing the element
var oo = 5; // its gonna be new value for coefficient
for (int i = 0; i < 64; i++) // some cycle
{
ll[0][i][0] = Convert.ToInt16(oo); // changes
}
oJpegDecompress.jpeg_finish_decompress();
oFileStreamImage.Close();
/////
System.IO.FileStream objFileStreamMegaMap = System.IO.File.Create(@"D:8.jpg");
BitMiracle.LibJpeg.Classic.jpeg_compress_struct oJpegCompress = new BitMiracle.LibJpeg.Classic.jpeg_compress_struct();
oJpegCompress.jpeg_stdio_dest(objFileStreamMegaMap);
oJpegDecompress.jpeg_copy_critical_parameters(oJpegCompress);
oJpegCompress.Image_height = joj;
oJpegCompress.Image_width = jo;
oJpegCompress.jpeg_write_coefficients(JBlock);
oJpegCompress.jpeg_finish_compress();
objFileStreamMegaMap.Close();
oJpegDecompress.jpeg_abort_decompress();
oFileStreamImage.Close();
}
有点马虎,但是,只是测试... 使用了 here
中的一些代码像这样,正如您在控制台中看到的那样,输出图像中 0->m_buffer->0->i 下的每个第 0 个元素将等于 5
向我致敬。