Java 在线程中保存大图像 - IP 摄像机图像损坏

标签 java multithreading image overwrite

单击我的应用程序中的按钮后,它会创建新的普通线程并开始下载大图像并将其保存到文件中。一切都很顺利,但是当我多次单击按钮时,它不会出现错误,当我尝试查看这些图像时,它们会被窃听,就像它们正在覆盖自己一样。

我不知道如何调试它。

localPath = today + "/" + productCode + "/" + this.placeId; //Unique

/* ... */

private void productSave(String productCode, int whichCamera, boolean isError) {
  for (int i = position; i < lastCamera; i++) {
    Date dateSave = new Date();
    path = localPath + "/" + dateFormat.format(dateSave) + "_" + (i + 1) + ".jpg";

    try {
      BufferedImage imageOld = ImageIO.read(new URL(this.camerasUrlsToSave[i]));

      ImageIO.write(imageOld, "jpg", new File(rootPath + "/" + path));

      ComDb.getInstance().saveProduct(productCode, this.placeId, path, dateSave);
    } catch (IOException ex) {
      result = false;
    }
  }
}

编辑:路径 100% 唯一(带有产品代码的不同文件夹)。相机拍摄的图像应该不是问题 - 我可以打开 10 张卡片,但没有看到图像错误

EDIT2:可以像下载 Img bufor 一样吗?因为所有图片都是从同一个IP下载的。或者可能是 bufferedimg 内存泄漏的问题。需要知道如何修复它。

EDIT3:我发现如果我在网络浏览器中使用我的相机地址打开 5 张卡片,例如:blah.blah.some.ip/GetImage.cgi?CH=0 它们会一张接一张地加载,而不是一次全部加载。但是,下载结束时我没有看到有缺陷的图像。

EDIT4:如果我尝试在 ff 和 IE 中打开链接,我尝试在网络浏览器中重现此错误。 IE 打印“getImage busy”。当我尝试 ff 和 chrome 时,图像损坏了。所以我必须做一些事情,比如队列或禁用按钮......

EDIT5:我的临时解决方案:同步函数productSave。第二次点击的图像将在几秒钟后保存。

http://oi57.tinypic.com/ofrrn.jpg !

One from saved Images

最佳答案

按钮的单击事件的第一个操作应该是禁用按钮,并可能将文本更改为“处理中”。最后一个操作应该是重新启用按钮并恢复文本。

关于Java 在线程中保存大图像 - IP 摄像机图像损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25568509/

相关文章:

java - 无法避免在 do while 中生成相同的随机数

java - 如何尽可能快地插入数据库(多线程程序)?

javascript - 如何使用 Javascript 检测图片是否模糊?

php - 在 codeigniter 中查看用户数据和个人资料图片?

html - 使图像响应(使用浏览器调整大小)

java - webelement 列表中的一些 webelements 值变为空白 如何等待 webelement 的每个值出现在 selenium 的 webelements 中

java - 在 Java 8 lambda 中使用本地 Vavr 不可变集合

java - 服务在应用程序关闭时停止,而以前没有

Python 队列问题 - queue.get 不删除对象

java - 当涉及的所有指令都是内存 I/O 时,多线程是否比串行执行有任何优势