繁体   English   中英

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

[英]How to compress an image with JPEG or PNG in C# in-memory?

我目前正在使用C#和EmguCV(OpenCV),并希望使用当前由Mat类表示的JPEG / PNG压缩/解压缩图像。 我不想将其存储在磁盘上,只需将其压缩在内存中即可。 目标是稍后通过TCP / IP进行传输。

高度赞赏以下任务的一些代码片段:

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

这是使用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);
        }
    }

希望这对某人有帮助:-)谢谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM