如何使用Visual C#和LibJpeg.Net从Jpeg获取DCT系数

时间:2015-02-10 19:13:26

标签: c# jpeg dct

我需要在量化之后获得DCT系数阵列以进一步改变比特(隐写术)。 我的问题是:让我们说,我有图片框中的jpeg图像或其他什么。我怎样才能进入dct coef。这个图像使用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 coeff?使用.Access()?我该如何使用它?有什么例子吗?

下列的程序:

short[] block = JBlock[c].Access(x, y);

给出了一个错误:“不能隐式地将类型'BitMiracle.LibJpeg.Classic.JBLOCK [] []'转换为'short []'”

此外,在使用类似的东西时,它会将“BitMiracle.LibJpeg.Classic.JBLOCK [] []”转换为“System.IConvertible”类型时出错。

或许有人知道另一个简单的方法来解决我的问题?

2 个答案:

答案 0 :(得分:2)

好吧,我想出了什么。至少,它回答了我的主要问题。

private void button1_Click(object sender, EventArgs e)
        {
            string path = @"D:\067.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:\068.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-&gt; m_buffer-&gt; 0-&gt; i下的每个第0个元素将等于5

所有人都欢呼。

答案 1 :(得分:-1)

我在编写JPEG库时已经完成了这项工作,以验证其正确性。你只需要获得LIBJPEG的源代码;确定它对你感兴趣的函数所处的位置(有些困难,因为代码是错综复杂的);设置一个断点或返回那里。