はここ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);
}
}
これは誰かを助けることを願っています:-)助けてくれてありがとう!
EmguCVは使用していませんが、ドキュメントを見ると、MatオブジェクトにBitmapプロパティがあるようです。生のバイトを取得するためにストリーム(MemoryStreamなど)に直接シリアル化するために、BitmapでSaveを呼び出すことができます。保存機能では、フォーマット(pngとjpgの許可)を指定することができます。別の方向に進むと、メモリから直接ビットマップをロードするためにSystem.Drawing.Image.FromStream()を呼び出すことができます。 – RogerN
@RogerN:それは非常に有望に見えます!私はこのアプローチを試し、結果を報告するつもりです。ご助力ありがとうございます! – salocinx
これらの形式は、ファイルに格納されるときにのみ圧縮されます。画像を読み込むポイントは、できるだけ早く次の作業を行うことです。メモリは非常に安いです。任意にImage.Save()を使用してMemoryStreamに格納することができます。 –