如何使用 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

向我致敬。