Я работаю над проектом совместного использования экрана. Я отправляю только различия экрана через сокет, сравнивая предыдущий и фактический буфер. Это работает
Я отправляю клиенту от 8 до 9 кадров в секунду, используя Format16bppRgb555
, чтобы уменьшить общий размер растрового изображения в байтах.
byte[] wholescreensize= new byte[1360 * 768 * 2];// Its around 2 Mb
Моя проблема в том, что при изменении полноэкранного режима.
Я получаю около 45-60 КБ изображения PNG, используя функцию ниже
45кб * 10 (FPS) = 450 кб
Можно уменьшить за пределы 45 кб.
Я не заинтересован в снижении FPS, поскольку это приложение для демонстрации экрана в реальном времени.
Сжатие JPEG или LZ4/GZIP также не имеет большого значения, так как изображение PNG уже сжато.
private void SendImgDiffToClient(byte[] contents,Rectangle rectangle)
{
//Converting Small Portion to Bitmap.Bcoz Image.FromStrem not working here error Parameter is not Valid
byte[] byteArrayout = new byte[contents.Length];
var bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format16bppRgb555);
var bitmap_data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format16bppRgb555);
Marshal.Copy(contents, 0, bitmap_data.Scan0, byteArrayout.Length);
bitmap.UnlockBits(bitmap_data);
//Converting Small Bitmap to Png Byte Array and Sending to Client
using (MemoryStream ms = new MemoryStream())
{
Image msImage = (Image)bitmap;
msImage.Save(ms, ImageFormat.Png);
msImage.Dispose();
byteArrayout = ms.ToArray();
}
SendtoClient(byteArrayout);
}
Мои поиски - это лучший подход к уменьшению байтов в таком сценарии.