2011-10-27 2 views
5

я сохранить изображение JPEG с помощью следующего C# EmguCV код:EmguCV - как указать качество jpeg при сохранении изображения?

Emgu.CV.Image<Gray, byte> image 
... 
image.Save("imageName.jpg"); 

Но изображение сохраняется в экстремально низкого качества (1 цветной квадрат на 8х8 пикселей).

Когда я сохранить BMP все в порядке:

Emgu.CV.Image<Gray, byte> image 
... 
image.Save("imageName.bmp"); 

Как повысить качество Jpeg при использовании Emgu.Cv.Image.Save или я должен вызвать другую функцию? Почему качество по умолчанию настолько низкое?

Попытался спросить на EmguCV forum, но он недоступен.

+0

Привет от имени EMGU Извиняюсь за сайт быть вниз, но я всегда троллинг здесь и CodeProject для любых вопросов, которые я могу помочь с. Cheers – Chris

+0

@Chris Спасибо большое. Теперь я знаю, с кем я могу спросить. Предложите стабильную работу сайта! – sergtk

ответ

8

EMGU имеет только image.Save (имя файла), поэтому вы должны использовать метод .Net сохранения изображения. Этот код получен из here. Я разделил код, чтобы этот код открыл файл, а затем попытался его сохранить. Это функция, которую вы интересуетесь saveJpeg (SaveFile.FileName, img.ToBitmap(), 100);. На основе функции saveJpeg (строковый путь, битмап img, длинное качество).

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 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, если вы застряли, дайте мне знать.

Надеется, что это помогает,

Chris

+0

Кажется, подходит для меня. Благодарю. В любом случае что-то странное произошло с EmguCV - почему он сохраняет jpeg с таким низким качеством? Я не понимаю. – sergtk

+0

Я не могу точно указать, что я не впервые сталкивался с такими плохими функциями экономии изображения, ведь некоторые дорогостоящие системы MVS используют одинаковое качество сжатия. Я расскажу об этом, однако это может не сделать его новым релизом, так как этот метод скорее специфичен для платформы. Рад, что это помогло, Cheers – Chris

+0

Я нашел, как воспроизвести такое странное поведение. Если приложение запущено под VS2010, а каталог bin содержит highgui210d.dll проблема возникает, если я удаляю файл highgui210d.dll, все работает нормально ... – sergtk

-1

Попробуйте это. И почему бы вам не использовать старый и хороший документ OpenCV http://opencv.itseez.com?

int quality = 100; // 0 - low, 100 - best 
image.Save("imageName.bmp", CV_IMWRITE_JPEG_QUALITY, quality); 
+1

Извините, но с EMGU это невозможно, и ссылка OpenCV не применима. – Chris

4

Опираясь на ответ Криса, если кому-то интересно здесь просто продление;

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); 
    } 
} 

Использование;

var fname = 0; 
while(true) 
{ 
    try 
    { 
     var img = capture.QueryFrame(); 
     img.Save(String.Format(@"c:\rec\{0}.jpg", ++fname), 100); 
    } catch(Exception) { break; } 
} 
0

Вот как я сделал с Emgu CV:

CvInvoke.Imwrite(path, cvImage, new KeyValuePair<ImwriteFlags, int> (ImwriteFlags.JpegQuality, quality)); 

 Смежные вопросы

  • Нет связанных вопросов^_^