2017-02-08 6 views
0

私は現在C#とEmguCV(OpenCV)で作業しており、現在はMatクラスで表されているJPEG/PNGで画像を圧縮/伸張したいと考えています。私はそれをディスクに保存するのではなく、メモリ内で圧縮するだけです。目標は後でTCP/IPで転送することです。C#のメモリ内のJPEGまたはPNGで画像を圧縮する方法は?

非常に認め、次のタスクのためのいくつかのコードスニペット:

A. Compress: Mat -> JPEG/PNG compressed byte[] 
B. Decompress: JPEG/PNG compressed byte[] -> Mat 
+1

EmguCVは使用していませんが、ドキュメントを見ると、MatオブジェクトにBitmapプロパティがあるようです。生のバイトを取得するためにストリーム(MemoryStreamなど)に直接シリアル化するために、BitmapでSaveを呼び出すことができます。保存機能では、フォーマット(pngとjpgの許可)を指定することができます。別の方向に進むと、メモリから直接ビットマップをロードするためにSystem.Drawing.Image.FromStream()を呼び出すことができます。 – RogerN

+0

@RogerN:それは非常に有望に見えます!私はこのアプローチを試し、結果を報告するつもりです。ご助力ありがとうございます! – salocinx

+0

これらの形式は、ファイルに格納されるときにのみ圧縮されます。画像を読み込むポイントは、できるだけ早く次の作業を行うことです。メモリは非常に安いです。任意にImage.Save()を使用してMemoryStreamに格納することができます。 –

答えて

0

はここJPGは、ネットワーク転送のためのバイト配列を返すとMatオブジェクトを圧縮するための最終的なコードです:

using Emgu.CV; 
    using System.Drawing.Imaging; 

    private VideoQuality quality; 
    private ImageCodecInfo codecInfo; 
    private EncoderParameters encoderParameters; 

    public byte[] compress(Mat image) { 
     using(MemoryStream memstream = new MemoryStream()) { 
      long tstart = Toolkit.CurrentTimeMillis(); 
      image.Bitmap.Save(memstream, codecInfo, encoderParameters); 
      return memstream.ToArray(); 
     } 
    } 

    private void setVideoQuality(long quality) { 
     this.codecInfo = getEncoder(ImageFormat.Jpeg); 
     this.encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    } 

    private ImageCodecInfo getEncoder(ImageFormat format) { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
     foreach(ImageCodecInfo codec in codecs) { 
      if(codec.FormatID == format.Guid) { 
       return codec; 
      } 
     } 
     return null; 
    } 

そして、ここですバイト配列をデコードするための対応コード:

private Image createImage(byte[] bytes) { 
     using (MemoryStream memstream = new MemoryStream(bytes, 0, bytes.Length)) { 
      memstream.Position = 0; 
      return Image.FromStream(memstream, true); 
     } 
    } 

これは誰かを助けることを願っています:-)助けてくれてありがとう!

関連する問題