我正在从事屏幕共享项目,通过比较以前和实际缓冲区的差异,仅发送屏幕差异到套接字。它正在工作。
我使用
我使用
Format16bppRgb555
将每秒发送8到9个帧到客户端,以减少位图的总字节数。byte[] wholescreensize= new byte[1360 * 768 * 2];// Its around 2 Mb
我的问题是全屏切换时发生了变化。
我使用以下函数获取大约45-60 kb的PNG图像
45kb * 10(FPS)= 450 kb
有可能将其减少到45 kb以下。
由于这是实时屏幕共享应用程序,我不想降低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);
}
我的问题是,在这种情况下,最好的减少字节数的方法是什么。