首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EmguCV -如何在保存图像时指定jpeg质量?

问EmguCV -如何在保存图像时指定jpeg质量?
EN

Stack Overflow用户
提问于 2011-10-27 17:50:12
回答 4查看 15.7K关注 0票数 6

我使用以下C# EmguCV代码保存jpeg图像:

代码语言:javascript
复制
Emgu.CV.Image<Gray, byte> image
...
image.Save("imageName.jpg");

但是图像是以极低的质量存储的(每8x8像素1个色块)。

当我保存bmp时,一切正常:

代码语言:javascript
复制
Emgu.CV.Image<Gray, byte> image
...
image.Save("imageName.bmp");

如何在使用Emgu.Cv.Image.Save时提高jpeg质量,还是应该调用其他函数?为什么默认质量这么低?

已尝试在EmguCV forum上请求,但无法访问。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-27 21:59:54

EMGU只有image.Save(文件名),因此您必须使用.Net方法来保存图像。这段代码是从here派生的。为了方便起见,我将代码分开,这段代码打开一个文件,然后尝试保存它。这是您对saveJpeg(SaveFile.FileName,img.ToBitmap(),100);感兴趣的函数。基于函数saveJpeg(字符串路径,位图img,长质量)。

代码语言:javascript
复制
open.Filter = "Image Files (*.tif; *.dcm; *.jpg; *.jpeg; *.bmp)|*.tif; *.dcm; *.jpg; *.jpeg; *.bmp";
if (open.ShowDialog() == DialogResult.OK)
{
    Image<Bgr, Byte> img = new Image<Bgr, Byte>(open.FileName);
    SaveFileDialog SaveFile = new SaveFileDialog();
    if (SaveFile.ShowDialog() == DialogResult.OK)
    {
        saveJpeg(SaveFile.FileName, img.ToBitmap(), 100);
    }
}

现在,要获得该函数的代码,您可以将其复制并粘贴到您的项目中,不要忘记代码顶部的using语句。

代码语言:javascript
复制
using System.Drawing.Imaging;

private void saveJpeg(string path, Bitmap img, long quality)
{
    // Encoder parameter for image quality

    EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

    // Jpeg image codec
    ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg");

    if (jpegCodec == null)
    return;

    EncoderParameters encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = qualityParam;

    img.Save(path, jpegCodec, encoderParams);
}

private ImageCodecInfo getEncoderInfo(string mimeType)
{
    // Get image codecs for all image formats
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

    // Find the correct image codec
    for (int i = 0; i < codecs.Length; i++)
    if (codecs[i].MimeType == mimeType)
    return codecs[i];
    return null;
}

这是EMGU最好的方法,如果你卡住了,请告诉我。

希望这能帮上忙

克里斯

票数 9
EN

Stack Overflow用户

发布于 2012-07-06 18:11:37

在Chris回答的基础上,如果有人感兴趣,这里有一个简单的扩展;

代码语言:javascript
复制
using System;
using System.Linq;
using System.Drawing.Imaging;
using Emgu.CV.Structure;

public static class EmguImageSave
{
    /// <summary>
    /// Save a jpeg image with a specified quality
    /// </summary>
    /// <param name="path">Name of the file to which to save the image</param>
    /// <param name="quality">Byte that specifies JPEG Quality of the image encoder</param>
    public static void Save( this Emgu.CV.Image<Bgr, Byte> img, string filename, double quality )
    {
        var encoderParams = new EncoderParameters( 1 );
        encoderParams.Param[0] = new EncoderParameter(
            System.Drawing.Imaging.Encoder.Quality,
            (long)quality
            );

        var jpegCodec = (from codec in ImageCodecInfo.GetImageEncoders()
                         where codec.MimeType == "image/jpeg"
                         select codec).Single();

        img.Bitmap.Save( filename, jpegCodec, encoderParams );
    }
}

用法;

代码语言:javascript
复制
var fname = 0;
while( true )
{
    try
    {
        var img = capture.QueryFrame();
        img.Save( String.Format( @"c:\rec\{0}.jpg", ++fname), 100 );
    } catch( Exception ) { break; }
}
票数 5
EN

Stack Overflow用户

发布于 2017-09-03 23:40:22

下面是我如何使用Emgu的简历:

代码语言:javascript
复制
CvInvoke.Imwrite(path, cvImage, new KeyValuePair<ImwriteFlags, int> (ImwriteFlags.JpegQuality, quality));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7914243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档