В настоящее время у меня есть приложение, которое делает снимок экрана рабочего стола докладчика, а затем транслирует его по специальному протоколу зрителям. Чтобы изображения передавались достаточно быстро, чтобы получить частоту кадров 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();