如何在内存C#中使用JPEG或PNG压缩图像?
我目前正在使用C#和EmguCV(OpenCV),希望使用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返回一个字节数
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类的静态成员提供。到目前为止,我将尝试这两种方法,并在这里发布一些结果。