2015-02-10 136 views
0

爲了進一步改變位(隱寫術),我需要在量化後獲得DCT係數數組。 我的問題是:可以說,我有在圖片框或任何其他JPEG圖像。我怎樣才能獲得係數。使用C#和庫像LibJpeg.Net這個圖像的?需要代碼請。在整個網絡上找不到任何完整和簡單的內容。另外,在LibJpeg.Net上看不到任何教程。如何使用Visual C#和LibJpeg.Net從Jpeg獲得DCT係數

此步驟後:

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); 

給出這樣的錯誤: 「無法隱式轉換類型 'BitMiracle.LibJpeg.Classic.JBLOCK [] []' 到 '短[]'」

而且,當使用類似的東西時,它給出了關於將「BitMiracle.LibJpeg.Classic.JBLOCK [] []」轉換爲鍵入「System.IConvertible」的錯誤。

或者,也許有人知道我的問題的另一種簡單方法?

+3

本網站旨在幫助您調試已編寫的代碼,而不是爲您提供代碼。試着自己想出一些東西,然後張貼你寫的東西,如果你無法正常工作。 – Kmeixner 2015-02-10 19:16:36

+0

我想問一下,如果有人有東西已經工作,並能夠分享。如果我沒有任何實例,教程和其他有用的東西,我就無法自己想出任何東西,而這些東西實際上會教。 – Errorfreak 2015-02-10 20:53:26

+0

來自[本文](http://stackoverflow.com/a/3736863/2243104)的'varrJBlockOrg'似乎與您有關。 – Reti43 2015-02-15 14:37:54

回答

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-下的每個第0個元素> m_buffer- > 0->我在輸出圖像將等於5

所有的冰雹給我。

-1

我寫了一個JPEG庫來驗證它的正確性。您只需將源代碼提供給LIBJPEG;確定你感興趣的函數在哪裏int(有些困難,因爲代碼是複雜的);設置一個斷點或返回。