序列化包含 BufferedImages 的对象

2024-01-04

正如标题所示,我试图将一个包含(以及其他变量、字符串等)一些 BufferedImage 的对象保存到文件中。

我找到了这个:如何序列化包含 BufferedImages 的对象 https://stackoverflow.com/questions/15058663/how-to-serialize-an-object-that-includes-bufferedimages/32088694#32088694

它的工作方式就像一个魅力,但有一个小挫折:如果你的对象只包含一个图像,它会很好地工作。

我一直在努力让他的解决方案能够处理多个图像(理论上应该有效),但是每次我读入文件时,我都会找回我的对象​​,我会得到正确数量的图像,但只有第一个图像实际上被读入;其他的只是空图像,其中没有数据。

这就是我的对象的样子:

 class Obj implements Serializable
    {
transient List<BufferedImage> imageSelection= new ArrayList<BufferedImage>();
     // ... other vars and functions

private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(imageSelection.size()); // how many images are serialized?
        for (BufferedImage eachImage : imageSelection) {
            ImageIO.write(eachImage, "jpg", out); // png is lossless
        }
    }

 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        final int imageCount = in.readInt();
        imageSelection = new ArrayList<BufferedImage>(imageCount);
        for (int i=0; i<imageCount; i++) {
            imageSelection.add(ImageIO.read(in));
        }
    }

    }

这就是我在文件中写入和读取对象的方式:

// writing
try (
              FileOutputStream file = new FileOutputStream(objName+".ser");
              ObjectOutputStream output = new ObjectOutputStream(file);
            ){
              output.writeObject(myObjs);
            }  
            catch(IOException ex){
              ex.printStackTrace();
            }

// reading
try(
                    FileInputStream inputStr = new FileInputStream(file.getAbsolutePath());
                    ObjectInputStream input = new ObjectInputStream (inputStr);
                    )
                    {myObjs = (List<Obj>)input.readObject();}
                catch(Exception ex)
                    {ex.printStackTrace();}

即使我有一个对象列表,它们也会被正确读取,并且列表中的每个元素都会相应填充,BufferedImage 除外。

有人有办法解决这个问题吗?


问题很可能是ImageIO.read(...)在读取第一个图像后错误地定位流。

我看到有两个选项可以解决这个问题:

  • 重写序列化BufferedImage写入图像的支持数组、高度、宽度、颜色模型/颜色空间标识符以及重新创建图像所需的其他数据BufferedImage。这需要一些代码来正确处理各种图像,因此我现在将跳过详细信息。可能更快、更准确(但可能会发送更多数据)。

  • 继续序列化使用ImageIO,但使用缓冲每个写入ByteArrayOutputStream,并在每个图像前面添加其字节数。回读时,首先读取字节数,并确保完全读取每个图像。这实现起来很简单,但由于文件格式的限制,某些图像可能会被转换或丢失细节(即 JPEG 压缩)。就像是:

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(imageSelection.size()); // how many images are serialized?
    
        for (BufferedImage eachImage : imageSelection) {
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            ImageIO.write(eachImage, "jpg", buffer);
    
            out.writeInt(buffer.size()); // Prepend image with byte count
            buffer.writeTo(out);         // Write image
        }
    }
    
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
    
        int imageCount = in.readInt();
        imageSelection = new ArrayList<BufferedImage>(imageCount);
        for (int i = 0; i < imageCount; i++) {
            int size = in.readInt(); // Read byte count
    
            byte[] buffer = new byte[size];
            in.readFully(buffer); // Make sure you read all bytes of the image
    
            imageSelection.add(ImageIO.read(new ByteArrayInputStream(buffer)));
        }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化包含 BufferedImages 的对象 的相关文章

  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 如何删除文件

    我们有一个脚本 scripts ourscript php和一个文件 media movie1 flv 当我们运行时 我们如何删除这个文件ourscript php Using unlink http php net manual en f
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 如何向 VisualVM 提供 JVM 参数?

    我使用 JDK 1 6 0 26 中的 VisualVM 来分析在 Tomcat 下运行的 Java Web 应用程序 但 VisualVM 经常告诉我它没有足够的内存来拍摄快照 并使用 Xmx 开关为 Netbeans 提供更多内存 问题
  • appcompat_v7 abc_activity_chooser_view.xml 中的重复 id @+id/image:58

    创建 apk 时出现以下错误 重复的 id id image 已在此布局中先前定义 abc activity chooser view xml 布局中的 58 appcompat v7 于是我就清理了一下 还是这样 该文件中确实存在重复的
  • 括号检查器代码的测试用例不正确。对于“(()”输出应该是“不平衡”,但我正在“平衡”[重复]

    这个问题在这里已经有答案了 给定一个表达式字符串 exp 检查是否是对和顺序 表达式中是正确的 例如 程序应该打印 balanced for exp and not balanced for exp Input 输入的第一行包含一个整数 T
  • 根据 ocr 图像结尾的段落将字符串拆分为列

    我正在开发一个项目 将打字机写的战争日记笔记从 PDF 扫描转换为文本 我可以成功地 对于原始的未调整大小的文件 可能是 90 提取我首先裁剪的主要文本 Reprex 数据 您可以从头开始尝试使用图像或我在下面提供的文本 我的挑战是保持文本
  • AngularJS:将对象从指令传递到控制器

    在我的指令中 我正在实例化一个对象 我想将此对象传递到与该指令关联的控制器的范围 我怎么做 请记住 这是一个独立的代码 供您理解该问题 在实际问题中 它无助于在控制器内部实例化该对象 我知道指令中的范围对象用于传递 HTML 中指定的值 我
  • 如何在运行单元测试时获取目录

    您好 当运行我的单元测试时 我想要获取我的项目正在运行的目录以检索文件 假设我有一个名为 MyProject 的测试项目 我运行的测试 AppDomain CurrentDomain SetupInformation Application
  • SecurityContextHolder 提供错误的用户详细信息

    在我的应用程序中 我们正在捕获每笔交易的用户详细信息SecurityContextHolder认证对象 但它给出了错误UserID它似乎 以下是代码片段供您参考 安全上下文 xml 弹簧安全 3 2
  • 使用 Spring Data Redis 连接到多个 Redis 服务器

    我正在开发一个具有以下要求的应用程序 Spring 从Redis Server1读取数据 从Redis Server2读取数据 从Redis Server3读取数据 AND 将信息保存到 MySQL 有人可以给我们一个想法 使用 Sprin
  • iGraph中介数的计算

    我见过一些info https stackoverflow com questions 20388087 differences in centrality measures between igraph and tnet表明 iGraph
  • 无法在 iOS 中创建具有文件保护的 SQLite3 数据库

    背景 我一直在观看 WWDC 2011 208 Securing iOS application 他们提到如何使用名为 NSFileProtection 的文件加密来保护我们的数据 当我发现提到的自动方法 38 00 被窃听 https d
  • 原子长操作

    我需要执行以下操作 average total elapsed are Long s average total average elapsed total 但我想用AtomicLong 这就是我正在尝试的 但我不太明白它是否正确 aver
  • Power BI 矩阵中的多种数据类型

    我在 10 个位置有大约 20 个不同的指标 并且想要创建一个矩阵 其中指标作为行 位置作为不同的列 我遇到的问题是指标是不同的数据类型 有些是整数 有些是 s 有些是 s 有没有办法像 Excel 一样将每一行自定义格式为不同的数据类型
  • 访问 ruby​​ 中嵌套哈希的元素[重复]

    这个问题在这里已经有答案了 我正在编写一个用 ruby 编写的小实用程序 它广泛使用嵌套哈希 目前 我正在检查对嵌套哈希元素的访问 如下所示 structure a gt b gt foo I want structure a b valu
  • C#.NET 中的 SQLite3

    我正在尝试在 C NET 中使用 SQLite3 我用谷歌搜索了一下 发现了一些不同的 API 我还检查了 SQLite 网站上的包装器 我喜欢它们 但想编写自己的包装器而不使用添加的依赖项 我发现不需要添加依赖项的所有包装器都不是免费的
  • 使用 jpeglib 进行 JPEG 压缩字节流

    我将 JPEG 压缩字节流存储在名为 Image 的变量中 并且我想将此字节流转换为 RGB 例如 unsigned char Image 我的问题是 有没有办法将 Image 传递给 jpeg stdio src 来获取 RGB 颜色值
  • 使用@Value注释

    我有 2 个属性文件a 属性 and b 属性我已将应用程序上下文添加为
  • 从 asp:textbox 获取文本

    我正在用 C 编写 ASP NET 项目 UpdateUserInfo aspx 页面由文本框和按钮组成 在 pageLoad 方法中 我向文本框设置了一些文本 当单击按钮时 我获取文本框的新值并将其写入数据库 问题是 即使我更改了文本框
  • RubyMine:项目中未找到 Rails 服务器启动器

    将现有项目导入 RubyMine 后 在运行 编辑配置时遇到 项目中未找到 Rails 服务器启动器 我已经检查过这个无法在 Rubymine 中启动调试器 在项目中找不到 Rails 服务器启动器 https stackoverflow
  • Rails 3.2 force_ssl(登陆页面除外)

    我想在除登陆页面之外的所有路由上强制执行 SSL 我尝试在所有控制器中设置force ssl 对于包含root的控制器 我做了 force ssl 除了 gt 索引 然而 当我将其部署到 Heroku 上的临时应用程序后 我的应用程序仍在主
  • 序列化包含 BufferedImages 的对象

    正如标题所示 我试图将一个包含 以及其他变量 字符串等 一些 BufferedImage 的对象保存到文件中 我找到了这个 如何序列化包含 BufferedImages 的对象 https stackoverflow com questio