如何在内存C#中使用JPEG或PNG压缩图像?

如何在内存C#中使用JPEG或PNG压缩图像?,c#,stream,compression,jpeg,emgucv,C#,Stream,Compression,Jpeg,Emgucv,我目前正在使用C#和EmguCV(OpenCV),希望使用JPEG/PNG压缩/解压缩一幅图像,该图像当前由Mat类表示。我不想把它存储在磁盘上,只是把它压缩到内存中。目标是以后通过TCP/IP传输 非常感谢以下任务的一些代码片段: A. Compress: Mat -> JPEG/PNG compressed byte[] B. Decompress: JPEG/PNG compressed byte[] -> Mat 下面是压缩Mat对象的最后一段代码,JPG返回一个字节数

我目前正在使用C#和EmguCV(OpenCV),希望使用JPEG/PNG压缩/解压缩一幅图像,该图像当前由
Mat
类表示。我不想把它存储在磁盘上,只是把它压缩到内存中。目标是以后通过TCP/IP传输

非常感谢以下任务的一些代码片段:

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

下面是压缩
Mat
对象的最后一段代码,JPG返回一个字节数组用于网络传输:

    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对象似乎具有位图属性。您可以对位图调用Save,以便将其直接序列化为流(例如MemoryStream),以获取原始字节。保存功能允许您指定格式(允许png和jpg)。相反,您可以调用System.Drawing.Image.FromStream()直接从内存加载位图。@RogerN:看起来很有希望!我将尝试这种方法,并报告我的结果。非常感谢你的帮助!这些格式仅在存储在文件中时才被压缩。加载图像的目的是尽可能快地完成下一步的操作。内存非常便宜。您可以任意使用Image.Save()将其存储在MemoryStream中。OpenCV的“imdecode”和“imencode”正好用于此目的。可能emgucv有它们,tooYes、“imencode”和“imdecode”作为CvInvoke类的静态成员提供。到目前为止,我将尝试这两种方法,并在这里发布一些结果。