我能知道 BufferedImage 最初的文件类型是什么吗?

2023-12-21

在我的代码中,我有一个缓冲图像 http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html那是装载有ImageIO http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html像这样的类:

BufferedImage image = ImageIO.read(new File (filePath);

后来,我想将它保存到字节数组中,但是ImageIO.write方法要求我选择 GIF、PNG 或 JPG 格式来编写图像(如教程中所述)here http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html).

我想选择与原始图像相同的文件类型。如果图像最初是 GIF,我不希望将其保存为 PNG 带来额外的开销。但如果图像最初是 PNG,我不想通过将其保存为 JPG 或 GIF 来失去半透明度等。有没有办法可以从 BufferedImage 确定原始文件格式是什么?

我知道我可以在加载图像时简单地解析文件路径以查找扩展名并保存以供稍后使用,但我理想情况下希望有一种直接从 BufferedImage 执行此操作的方法。


正如@JarrodRoberson 所说,BufferedImage没有“格式”(即没有文件格式,它确实有几种像素格式之一,或像素“布局”)。我不了解 Apache Tika,但我想他的解决方案也可行。

但是,如果您更喜欢仅使用ImageIO并且不向项目添加新的依赖项,您可以编写如下内容:

ImageInputStream input = ImageIO.createImageInputStream(new File(filePath));

try {
    Iterator<ImageReader> readers = ImageIO.getImageReaders(input);

    if (readers.hasNext()) {
        ImageReader reader = readers.next();

        try {
            reader.setInput(input);

            BufferedImage image = reader.read(0);  // Read the same image as ImageIO.read

            // Do stuff with image...

            // When done, either (1):
            String format = reader.getFormatName(); // Get the format name for use later
            if (!ImageIO.write(image, format, outputFileOrStream)) {
                // ...handle not written
            }
            // (case 1 done)

            // ...or (2):
            ImageWriter writer = ImageIO.getImageWriter(reader); // Get best suitable writer

            try {
                ImageOutputStream output = ImageIO.createImageOutputStream(outputFileOrStream);

                try {
                    writer.setOutput(output);
                    writer.write(image);
                }
                finally {
                    output.close();
                }
            }
            finally {
                writer.dispose();
            }
            // (case 2 done)
        }
        finally {
            reader.dispose();
        }
    }
}
finally {
    input.close();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我能知道 BufferedImage 最初的文件类型是什么吗? 的相关文章

随机推荐

  • 将正则表达式绑定到 PDO 语句中的 PDO 参数

    好的 我对 php 和 mysql 相当陌生 我正在创建一个 mysql 数据库的 php 前端 我使用 PDO 驱动程序访问数据库 因为它可以防止 SQL 注入攻击 到目前为止 一切都很好 直到我遇到这个问题 我有一个搜索功能 用户可以输
  • MySQL 错误 1443 解决方法

    我相信我的问题可以参考另一个问题 https stackoverflow com questions 1225496 mysql 1443 what does it mean标题几乎相同 但不幸的是答案对我来说不够清楚 而且这个问题也有 6
  • 使用css重置时如何在段落之间添加空格? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用 css 重置时 在段落之间添加空格的最安全 无高度变化的跨浏览器方法是什么 div p class text paragraph1 p p
  • Java GC(分配失败)

    为什么总是 GC 分配失败 适用于 linux amd64 JRE 的 Java HotSpot TM 64 位服务器 VM 25 25 b02 1 8 0 25 b17 CommandLine flags XX CMSInitiating
  • 作业完成后 Jenkins 杀死 JBoss 服务器

    我使用 Ant 通过 Jenkins 启动 关闭 JBoss 5 服务器 Ant java spawn 和 fork 设置为 true 因此命令在后台执行 Jenkins 成功启动服务器 等待两分钟 Jenkins 中的 睡眠 命令 然后在
  • 使用比较 Xcode iOS 9 中“其他进程”内存不足

    我的应用程序在内存为 0 5GB 的设备上崩溃 然而 在 Xcode 中分析内存使用情况 它很少超过 140MB 我用仪器检查过泄漏情况 但没有发现明显的泄漏 但是 当我运行我的应用程序时 其他进程 使用的内存总是非常高 这是启动后的静止状
  • 如何在 Xamarin Forms 中创建阴影

    如何使用 Xamarin Forms 在按钮或标签上创建阴影 我目前正在使用 Xamarin Forms 1 3 并尝试在 XAML 中执行此操作 如果可能 有没有人有一个可行的例子可以给我指点 我还没有尝试过这个 但您可以创建同一控件的
  • awk 搜索另一个文件中的字段

    我需要在第二个文件中搜索一个文件中的字段 想知道 awk 是否是正确的解决方案 file 1 one two file 2 something one balh one blah two blah two 所需输出 one somethin
  • 为什么在检查最近的提交后我有一个分离的 HEAD?

    最近 在使用 git 存储库时 我想查看旧提交中的代码 68cce45 所以我做了 git checkout 68cce45 查看更改后 我想返回到存储库的当前版本并继续工作 自从2bcfd11是最近的提交 我做了 git checkout
  • 如何将自动布局与容器转换结合使用?

    如何将自动布局与 UIViewController 容器转换方法一起使用 void transitionFromViewController UIViewController fromViewController toViewControl
  • 将一个数据系列绘制在另一个数据系列下方

    当您在 Matlab 中绘制图形时 最近绘制的数据系列会放置在已有数据之上 例如 figure hold on plot sin linspace 0 pi linewidth 4 color 0 0 1 plot cos linspace
  • Android Firebase 应用程序分发 - 服务凭证文件不存在。请检查服务凭证路径并重试

    我正在尝试从 Crashlytics Beta 迁移到 Firebase App Distribution 中间的 CircleCi CircleCi 中的构建失败并出现以下错误 什么地方出了错 任务 FiverrApp appDistri
  • Odoo 销售点 + 邮箱:如何修改收据

    我需要修改销售点收据 在 Odoo 销售点中 有两个打印收据的模板 XmlReceipt 和 PostTicket 当我使用 Posbox 时 我想我必须修改 XmlReceipt 请问有没有办法继承原来的模板 我找到了有关如何使用 Pos
  • 没有错误:无法在谷歌云存储上查看上传的文件

    使用云函数在云函数上运行 python 代码云函数 python https github com MartinSahlen cloud functions python 我正在云上处理图像 现在我想将该图像保存在google cloud
  • 使用 TStringList 的奇怪 EOutOfMemory 异常

    我有一个系统 它加载一些压缩到 log 文件中的文本文件 然后使用多个线程解析为信息类 每个线程处理不同的文件并将解析的对象添加到列表中 该文件是使用 TStringList 加载的 因为它是我测试过的最快的方法 文本文件的数量是可变的 但
  • 在 Python 中迭代模块

    所以我有一个嵌套文件夹 其中有执行某些操作的模块 注意 它们不是类 只是脚本 我想迭代这些模块 我现在拥有的 from scripts module 1 import train module 1 from scripts module 2
  • CouchDB Views - 列出函数性能影响?

    你们中的许多人都知道 couchdb 视图的响应如下 rows key 1 value Col1 Some Value key 2 value Col1 Another Value 好吧 我想将其整理为 key 1 value Col1 S
  • 如何更改作为参数传递给函数的变量?

    我试图通过使用返回 void 的函数来更改结构内的一些变量 该函数采用 Struct 成员作为参数 结构数组和大小 该函数有一些代码 最终会更改结构成员内的一些变量 但是 我知道当您将某些内容作为参数传递给函数时 您正在使用副本而不是原始文
  • 在 PHP 中通过 SSH 连接到 MySQL 服务器

    我想通过 ssh 建立一个到我的 mysql 服务器的 ssh 隧道 理想情况下 我会返回一个 mysqli db 指针 就像我直接连接一样 我所在的共享主机没有SSH2 http ca php net ssh2库 但我也许可以使用 PEC
  • 我能知道 BufferedImage 最初的文件类型是什么吗?

    在我的代码中 我有一个缓冲图像 http docs oracle com javase 7 docs api java awt image BufferedImage html那是装载有ImageIO http docs oracle co