【问题标题】:Java sending image through network with ImageIOJava 使用 ImageIO 通过网络发送图像
【发布时间】:2017-08-02 19:12:13
【问题描述】:

我有一个网络程序,它使用ImageIO.write(..) 通过网络发送BufferedImages 流,这按预期工作,除了有时在另一端收到的图像将只是一系列小的黑白长方形,然后它最终会切换回发送实际图像。

我在任何地方都找不到任何帮助。

我使用的是 Java 版本 1.8.0_65,我这样发送图像:

BufferedImage capture = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
BufferedImage newImage = new BufferedImage(capture.getWidth(), capture.getHeight(), BufferedImage.TYPE_4BYTE_ABGR_PRE);
newImage.createGraphics().drawImage(capture, 0, 0, newImage.getWidth(), newImage.getHeight(), null);
capture = newImage;
BufferedImage difference = null;
if (lastImage != null) {
    difference = getDifferenceImage(capture, lastImage);
} else {
    difference = capture;
}
long generated = System.currentTimeMillis() - start;
ImageIO.write(difference, "png", socket.getOutputStream());
socket.getOutputStream().flush();

【问题讨论】:

  • 你如何使用这个API? Java 版本是多少?
  • @RomanC 我更新了问题。
  • 我不是 PNG 格式的专家,但据我所知(the Wikipedia page 似乎证实了这一点),图像阅读器无法知道最后的“块”何时遇到PNG图像。您需要告诉客户端要阅读多少;一种方法是将图像写入字节数组,然后将 int 写入指示字节数的套接字,然后将字节本身写入套接字。

标签: java image networking graphics render


【解决方案1】:

试试这个代码:

public byte[] getCustomImageInBytes(BufferedImage originalImage) {
    byte[] imageInByte = null;
    try {
        // convert BufferedImage to byte array
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(originalImage, "png", baos);
        baos.flush();
        imageInByte = baos.toByteArray();
        baos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return imageInByte;
}

socket.getOutputStream().write(getCustomImageInBytes(difference));
socket.getOutputStream().flush();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多