gpt4 book ai didi

java - 在客户端和服务器之间以字节数组形式发送图像

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:11 24 4
gpt4 key购买 nike

我可以成功地将调整大小的 125 x 125 图像从客户端发送到服务器并进行绘制。唯一的问题是,那太小了。我希望能够发送更大的图像,但字节数组无法处理它,并且我收到 java 堆异常。目前我正在用它来解释我的形象。有没有更有效的方法?

在客户端

screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
screenShot = resize(screenShot, 125, 125);

ByteArrayOutputStream byteArrayO = new ByteArrayOutputStream();
ImageIO.write(screenShot,"PNG",byteArrayO);
byte [] byteArray = byteArrayO.toByteArray();
out.writeLong(byteArray.length);
out.write(byteArray);

如上面调用的调整大小方法。

    public static BufferedImage resize(BufferedImage img, int newW, int newH) {  
int w = img.getWidth();
int h = img.getHeight();
BufferedImage dimg = new BufferedImage(newW, newH, img.getType());
Graphics2D g = dimg.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);
g.dispose();
return dimg;
}

解释图像的服务器

in = new DataInputStream(Client.getInputStream());
long nbrToRead = in.readLong();
byte[] byteArray = new byte[(int) nbrToRead];
int nbrRd = 0;
int nbrLeftToRead = (int) nbrToRead;

while (nbrLeftToRead > 0) {
int rd = in.read(byteArray, nbrRd, nbrLeftToRead);
if (rd < 0)
break;
nbrRd += rd; // accumulate bytes read
nbrLeftToRead -= rd;
}
ByteArrayInputStream byteArrayI = new ByteArrayInputStream(
byteArray);
image = ImageIO.read(byteArrayI);

if (image != null) {
paint(f.getGraphics(), image);
} else {
System.out.println("null image.");
}

正如您所知,代码量很大并且很可能效率低下。我可以将图像的 1/10 发送 10 次,并在这些部分上进行绘制,但我想知道是否有更简单的方法来做到这一点。

最佳答案

您可能应该考虑通过网络将数据作为流传输。您可以使用第三方库,例如 RMIIO 。如果您可以使用 Web 服务进行数据传输,那么您可以查看消息传输优化机制 (MTOM),它可以让您以更有效的方式将数据作为流传输。更多详情请查看here

关于java - 在客户端和服务器之间以字节数组形式发送图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13596660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com