合并两个图像 --> 4 倍大小!如何减小文件大小?

2023-12-02

我使用下面的代码合并两个图像。一张不透明的基础图像,一张透明的覆盖图像。 其拥有的图像文件大小分别为 20kb 和 5kb。 合并两个图像后,生成的文件大小 > 100kb,因此至少是 25kb 组合大小的 4 倍。我预计文件大小小于 25kb。

public static void mergeTwoImages(BufferedImage base, BufferedImage overlay, String destPath, String imageName) {

    // create the new image, canvas size is the max. of both image sizes
    int w = Math.max(base.getWidth(), overlay.getWidth());
    int h = Math.max(base.getHeight(), overlay.getHeight());
    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

    // paint both images, preserving the alpha channels
    Graphics2D g2 = combined.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.drawImage(base, 0, 0, null );
    g2.drawImage(overlay, 0, 0, null);
    g2.dispose();

    // Save as new image
    saveImage(combined, destPath + "/" + imageName + "_merged.png");
}

我的应用程序必须具有非常好的性能,因此任何人都可以解释为什么会发生这种效果以及如何减少生成的文件大小?

多谢!

编辑: 非常感谢你的回答。保存图像的代码是:

public static void saveImage(BufferedImage src, String file) {
    try {
        File outputfile = new File(file);
        ImageIO.write(src, "png", outputfile);
    } catch (IOException e) {
        e.printStackTrace();
    }       
}

Because PNG是一种无损格式,只有两个主要因素可能影响文件大小:

  1. 文件中有多少像素,以及
  2. 格式的压缩效果如何。

因为听起来你正在做叠加,所以我猜#1 没有改变。比较输入和输出文件的像素尺寸以仔细检查这一点。

您遇到问题很可能是因为您的合并图像更加复杂,因此 PNG 过滤算法更难压缩文件。除了更改图像或切换到有损文件格式之外,您对此无能为力。

为了进一步解释一下,假设您有一张全白图像和一张全红色图像。两者都是 100x100 像素。这些图像非常容易压缩,因为您只需要编码:重复 red 10000 次。现在,假设您以每个其他像素都来自不同图像的方式合并这些图像。现在是方格的。如果您设置了良好的编码机制,您仍然可以通过说:重复 [red,white] 10000 次来很好地编码。但您会注意到,即使使用这种理想的编码算法,我也将编码消息的大小增加了很多。如果您没有一种非常适合此类事情的编码格式,那么一切都会从那里开始走下坡路。

一般来说,图像的像素相互之间越多样化、越随机,生成的文件就越大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并两个图像 --> 4 倍大小!如何减小文件大小? 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • Google 托管库不必要地使用缓存断路器

    我在仪表板上使用以下代码来不断刷新它而不会闪烁如何使用 jQuery 刷新页面 然而 由于一些缓存破坏器 这也会导致 javascript 每次重新加载
  • JavaScript 中的日期到时间戳

    javascript 是否可以将某些日期转换为时间戳 我有这种格式的日期2010 03 09 12 21 00我想用 javascript 将其转换为等效的时间戳 回应您的编辑 你需要解析日期字符串建立一个Date对象 然后就可以获取时间戳
  • create-react-app 中缩小的组件堆栈跟踪(开发模式)

    Running create react app in 发展 mode 为什么我的控制台错误链接到缩小的代码块 我想我记得 CRA 能够显示源映射文件 这是因为该错误是由您使用的依赖项之一引发的 当你安装一个包时 你会在你的node mod
  • 使用外部缓冲区存储字符串而不进行复制

    假设我有一个函数可以得到const string 作为其输入 例如 void foo const string s 然后我有一个内部缓冲区const char buffer 我知道它的大小 我认为如果我内联创建字符串 仍然会发生一份副本 f
  • 以编程方式查找 Chrome 浏览器历史记录

    我正在制作一个小型 Java 应用程序来显示用户最常访问 Chrome 中的哪些 URL 如何在 Java 中访问我的浏览器历史记录 创建一个ContentObserver班级 static class ChromeOberver exte
  • Python:循环读取所有文本文件行

    我想逐行读取巨大的文本文件 如果找到带有 str 的行则停止 如何检查是否到达文件末尾 fn t log f open fn r while not is eof f how to check that end is reached s f
  • 从表示图像的数组中提取环/扇形区域

    我正在尝试从 MATLAB 中图像的数组表示形式中提取特征 这些特征具有圆形 环 和扇形的形状 如下图所示 我花了相当多的时间寻找一个可以做到这一点的内置函数 我已经设法使用一个丑陋的循环来进行环提取 但不知道从哪里开始扇区部分 任何关于如
  • 如何为 Firefox、IE 和 Chrome 创建插件/附加组件

    我需要为 IE firefox 和 chrome 浏览器创建插件 附加组件 以满足以下要求 如果请求的网址采用特定格式 匹配特定正则表达式模式 则插件必须阻止该请求并弹出警报框 我进行了很多搜索 但没有找到任何有用的东西 对于IE 我认为我
  • 发布表单时如何获取复选框元素中未选中复选框的值?

    我有一个如下所示的表格
  • 使用 android.support.v7.app.ActionBar 的选项卡

    我最近更新了我的 Android 应用程序 以在 Android 2 3 上使用对操作栏和操作栏选项卡的 v7 支持 更新代码后 我在 4 2 设备和模拟 2 3 设备上运行该应用程序 操作栏和选项卡在真实硬件上显示良好 但在模拟设备上则不
  • NanoMsg (NNG) 和 FlatBuffers 是否适合该项目?

    大声喊出我们是否应该考虑更好的事情 我正在寻找一种非常快速且简单的方法来获取多个程序 例如 5 个 每个程序都在私有 OpenStack 云上的单独节点上运行以相互通信 数据包将是短 C 结构 小于 100 字节 交通流量将会较少 可能低于
  • 控制 JsonResult 中的序列化程序,又名 ASP.Net MVC 中的 Json 函数?

    有没有办法配置在控制器中通过 JsonResult 返回 JSON 时使用什么 JSON 序列化器 public ActionResult SomeJsonFunction var x SomeModelCode SomeModelFunc
  • 如何从 Firebase 检索 ListView 中的数据

    你能帮我解决这个问题吗 我尝试在 Listview 中显示 firebase 中的数据 但不显示任何内容 ListView listView FirebaseDatabase firebaseDatabase DatabaseReferen
  • 删除向量每个元素中第二次出现“-”之后的所有字符

    我想删除向量的每个元素中第二次出现 之后的所有字符 Initial string aa bbb cccc gt aa bbb aa vvv vv gt aa vvv aa ddd gt aa ddd 有什么帮助吗 根据示例输入和预期输出判断
  • 如何缩放和设置MediaView的坐标?

    我想在我的 JavaFx 2x 场景中嵌入一个视频 并根据我的需要调整它的大小和位置 我遇到的问题如下 如果我建立一个MediaView组件然后平移X或Y坐标 然后整个视图就被正确移动像这样 MediaView mv mv setTrans
  • 显示 Oracle SQL 中表的所有约束的名称

    我已经为在 Oracle SQL 中创建的多个表的每个约束定义了一个名称 问题是 要删除特定表的列的约束 我需要知道为每个约束提供的名称 但我已经忘记了 如何列出为表的每一列指定的所有约束名称 有没有这样的SQL语句 您需要查询数据字典 具
  • 使用 Powershell 删除 csv 文件末尾的空行

    我需要使用 Powershell 删除 CSV 文件末尾的空行 我尝试了下面的代码 此代码仅用于删除下面示例文件图像中的第 7 行和第 8 行 但我需要删除第 3 4 5 6 7 和 8 行 只有第 2 行有数据 任何建议将不胜感激 谢谢
  • 从另一个 js 文件导入函数。 JavaScript

    我有一个关于在 javascript 中包含文件的问题 我有一个非常简单的例子 gt index html gt models gt course js gt student js 课程 js function Course this id
  • 如何在c# Microsoft graph api请求中获取响应标头

    我正在尝试做文件复制使用 Microsoft graph API 在 c net core 中进行操作 这是一个异步操作 根据文档 它说它返回一个位置响应头检查操作的状态 现在的问题是我需要它的响应标头 以便我可以检查文件复制操作的状态 但
  • 合并两个图像 --> 4 倍大小!如何减小文件大小?

    我使用下面的代码合并两个图像 一张不透明的基础图像 一张透明的覆盖图像 其拥有的图像文件大小分别为 20kb 和 5kb 合并两个图像后 生成的文件大小 gt 100kb 因此至少是 25kb 组合大小的 4 倍 我预计文件大小小于 25k