微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java ImageIO写入太慢

如何解决Java ImageIO写入太慢

我正在用Java编写客户端-服务器应用程序,其中客户端不断获取屏幕截图,并使用套接字将其发送到服务器。服务器会在这些图像出现时显示它们,因此它是一种视频流软件。

我的问题是显示的视频不是很流畅。我发现这是由于使用ImageIO ImageWriter write()方法将BufferedImages转换为JPEG格式所致。我制作了一个测试类,它通过拍摄200张屏幕截图然后将其转换来测试此转换的性能

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {

    public static void main(String[] args) throws IOException,InterruptedException {

        new Conversiontest().test(200);
    }

    public static class ConversionTest {

        private BlockingQueue<byte[]> convertedImages = new LinkedBlockingQueue<>();
        private BlockingQueue<BufferedImage> screenshots = new LinkedBlockingQueue<>();

        public void test(int numOfScreenshots) throws IOException,InterruptedException {
            Robot robot;
            try {
                robot = new Robot();
            } catch (AWTException e) {
                e.printstacktrace();
                return;
            }

            Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
            Rectangle shotArea = new Rectangle(defaultToolkit.getScreenSize());
            for (int i = 0; i < numOfScreenshots; i++) {
                BufferedImage screenCapture = robot.createScreenCapture(shotArea);
                screenshots.add(screenCapture);
            }
            System.out.println(screenshots.size());
            
            
            ImageWriter writer =
                    ImageIO.getimageWritersByFormatName("jpeg").next();
            long timeBefore = System.nanoTime();
            for (int i = 0; i < numOfScreenshots; i++) {
                BufferedImage screenshot = screenshots.take();
                ByteArrayOutputStream bout = new ByteArrayOutputStream();
                writer.setoutput(new MemoryCacheImageOutputStream(bout));
                writer.write(new IIOImage(screenshot,null,null));
                bout.flush();
                convertedImages.add(bout.toByteArray());
            }
            long timeAfter = System.nanoTime();
            writer.dispose();
            double totalTime = (timeAfter - timeBefore) / 1000000.0 / 1000.0;
            System.out.println(numOfScreenshots + " screenshots: " + totalTime + " sec");
            System.out.println(numOfScreenshots / totalTime + " of screenshots per second.");
        }
    }
}

在我的机器上运行此代码后的输出是:

200 screenshots: 11.331018700000001 sec
17.650663660099685 of screenshots per second.

是否可以提高此经过测试的代码片段的性能?如果是这样,我该如何实现呢?我想将每秒的屏幕截图数量增加到大约30或更多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。