[英]How to scale down the size and quality of an BufferedImage?
我正在开发一个项目,一个名为“远程桌面控制”的客户端 - 服务器应用程序。 我需要做的是拍摄客户端计算机的屏幕截图并将此屏幕捕获发送到服务器计算机。 我可能需要每秒发送3到5张图像。 但考虑到直接发送BufferedImage
对于该过程来说成本太高,我需要减小图像的大小。 图像质量不必损失较少。
如何减小图像的字节大小? 有什么建议么?
您可以通过在套接字的另一端使用GZIPInputStream及其输出对应物,非常容易地使用ZIP压缩它。
编辑:
另请注意,您可以创建增量图像以进行传输,例如,您可以使用“transpartent color”(魔术粉色#FF00FF)来指示屏幕的该部分未进行任何更改。 另一方面,您可以在最后一个上绘制新图像,忽略这些魔术像素。
请注意,如果图片已包含此颜色,您可以将实际粉红色像素更改为#FF00FE。 这是不可能的。
另一个选择是为每个图像传输1位掩码 (在将无变化像素绘制成任意颜色之后。为此,您可以更改图像中主要使用的颜色,以获得最佳压缩比(最佳)哈夫曼编码)。
Vbence使用GZIPInputStream
的解决方案是一个很好的建议。 在大多数商业软件(Windows远程桌面,VNC等)中完成此操作的方式是仅发送对屏幕缓冲区的更改。 因此,您可以在服务器上保留客户“看到”的副本,并在每次连续捕获时计算屏幕区域的不同。 然后,您只将这些屏幕区域连同它们的左上角,宽度,高度一起发送到客户端。 并仅使用这些新区域更新客户端“视图”的服务器副本。
这将大大减少您使用的网络数据量,而我一直在键入此答案,每次击键时只有400左右的像素(20x20)正在变化。 这个在1920x1080的屏幕上只是屏幕的1 / 10,000,所以显然值得思考。
唯一昂贵的部分是如何计算一帧与下一帧之间的“差异”。 有很多库可以便宜地做到这一点,其中大多数是非常数学的(离散余弦变换类型的东西,我的头脑),但它可以相对便宜地完成。
一种方法是使用ImageIO API
ImageIO.write(buffimg, "jpg", new File("buffimg.jpg"));
至于质量和其他参数 - 我不确定,但它应该是可能的,只是深入挖掘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.