Обеспечение того, чтобы экспортированный JPEG был меньше максимального размера файла

В настоящее время у меня есть приложение, которое делает снимок экрана рабочего стола докладчика, а затем транслирует его по специальному протоколу зрителям. Чтобы изображения передавались достаточно быстро, чтобы получить частоту кадров 2–3 изображения в секунду, я должен убедиться, что размер изображения всегда меньше, чем ~ 300 КБ.

Я использую C # для приложения докладчика, которое кодирует снимок экрана в JPEG с помощью процесса, описанного ниже. Меня беспокоит то, что качество изображения может сильно различаться при использовании настройки статического сжатия. Если у меня есть приложение, захватывающее мой экран, вывод изображений составит ~ 200 КБ, когда у меня полноэкранный режим Visual Studio, но если я сверну экран и у меня появится фон рабочего стола, это будет ~ 400 КБ.

Я мог бы поместить процесс кодирования в цикл и непрерывно уменьшать размер изображения до тех пор, пока размер байтового массива не станет меньше 300 КБ, но это кажется утомительной операцией. Есть ли другой способ, которым я мог бы воспользоваться?

Заранее спасибо.

// get the screenshot
System.Drawing.Rectangle totalSize = System.Drawing.Rectangle.Empty;
//foreach (Screen s in Screen.AllScreens)
totalSize = System.Drawing.Rectangle.Union(totalSize, Screen.PrimaryScreen.Bounds);
Bitmap screenShotBitmap = new Bitmap(totalSize.Width, totalSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
screenShotBitmap.SetResolution(96, 96);
Graphics screenShotGraphics = Graphics.FromImage(screenShotBitmap);
screenShotGraphics.CopyFromScreen(totalSize.X, totalSize.Y,
                    0, 0, totalSize.Size, CopyPixelOperation.SourceCopy);
screenShotGraphics.Dispose();

// image codec information
ImageCodecInfo imageCodecInfo = GetEncoderInfo("image/jpeg");

// encoder settings
System.Drawing.Imaging.Encoder encoderQuality;
System.Drawing.Imaging.Encoder encoderColor;
encoderQuality = System.Drawing.Imaging.Encoder.Quality;
encoderColor = System.Drawing.Imaging.Encoder.ColorDepth;

// compression & quality for JPEG output
Int64 quality = 40L;

// storage for exported JPEG
byte[] screenShotByteArray;

// encoder parameters
EncoderParameter encoderQualityParameter = new EncoderParameter(encoderQuality, quality);
//EncoderParameter encoderColorParameter = new EncoderParameter(encoderColor, 8L);

// encoder parameters table
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = encoderQualityParameter;
//encoderParameters.Param[1] = encoderColorParameter;

// get the code into a memory stream
MemoryStream screenShotMemoryStream = new MemoryStream();
screenShotBitmap.Save(screenShotMemoryStream, imageCodecInfo, encoderParameters);

// convert to a byte array
screenShotByteArray = screenShotMemoryStream.GetBuffer();

// close the memory stream
screenShotMemoryStream.Close();
10
задан BSchlinker 11 May 2011 в 20:53
поделиться