- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下代码将 Image 转换为 byte[]。
public static byte[] extractBytes (String ImageName) throws IOException {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
BufferedImage img=ImageIO.read(new File(ImageName));
ImageIO.write(img, "jpg", baos);
return baos.toByteArray();
}
现在当我测试我的代码时:
public static void main(String[] args) throws IOException {
String filepath = "image_old.jpg";
File outp=new File(filepath);
System.out.println("Size of original image="+outp.length());
byte[] data = extractBytes(filepath);
System.out.println("size of byte[] data="+data.length);
BufferedImage img = ImageIO.read(new ByteArrayInputStream(data));
//converting the byte[] array into image again
File outputfile = new File("image_new.jpg");
ImageIO.write(img, "jpeg", outputfile);
System.out.println("size of converted image="+outputfile.length());
}
我得到了非常奇怪的结果:
Size of original image=78620
size of byte[] data=20280
size of converted image=20244
将图像转换为 byte[] 后,它的大小减少了大约 1/4,而且当我将 byte[] 转换回图像时,它的大小也发生了变化。但输出图像已在所需位置成功创建。放大 500-600% 后,我可以看到原始图像和新图像的质量略有不同。放大后新图像有点模糊。
这是我正在做测试的图像 http://pbrd.co/1BrOVbf
请解释这种尺寸变化的原因,我还想知道在此之后获得相同尺寸的任何方法。
最佳答案
您拥有的图像以最高质量设置压缩(ImageIO 术语中的“100%”或 1.0
)。 JPEG 压缩在如此高的设置下不是很有效,因此比平常大很多。使用 ImageIO.write(..., "JPEG", ...)
时,将使用默认质量设置。此默认值为 0.75
(尽管此类值的确切含义取决于编码器,并且不是精确的科学),因此质量较低,导致文件大小较小。
(原始图像和重新压缩图像之间文件大小显着减小的另一个可能原因是元数据的删除。使用 ImageIO.read(file)
读取时,您有效地去除 JPEG 文件中的任何元数据,如 XMP、Exif 或 ICC 配置文件。在极端情况下(是的,我在这里主要谈论 Photoshop ;-))此元数据可能比图像数据本身占用更多空间(即兆字节的元数据是可能的)。但是,您的文件并非如此。)
从第二次重新压缩(从 byte[]
到最终输出文件)可以看出,输出只是比输入稍微小一点。这是因为质量设置(未指定,因此仍使用默认值)在两种情况下都是相同的(此外,任何元数据也会在此步骤中丢失,因此不会增加文件大小)。微小的差异可能是由于 JPEG 解压缩/重新压缩中的一些小损失(舍入误差等)造成的。
虽然有点违反直觉,但在重新压缩 JPEG 时,始终可以通过使用相同质量设置(使用与原始表完全相同的表实际上应该是无损的,但仍可能会出现小的舍入误差)。提高质量设置会使文件输出更大,但质量实际上会降低。
要 100% 确保不丢失任何数据或图像质量的唯一方法是首先不对图像进行解码/编码,而只是逐字节复制文件,例如像这样:
File in = ...;
File out = ...;
InputStream input = new FileInputStream(in);
try {
OutputStream output = new FileOutputStream(out);
try {
copy(input, output);
}
finally {
output.close();
}
}
finally {
input.close();
}
以及复制方法:
public void copy(final InputStream in, final OutputStream out) {
byte[] buffer = new byte[1024];
int count;
while ((count = in.read(buffer)) != -1) {
out.write(buffer, 0, count);
}
// Flush out stream, to write any remaining buffered data
out.flush();
}
关于java - 使用 BufferedImage 和 ImageIO 将其转换为 byte[] 后图像大小变小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29273672/
我将尝试借助图片来解释我的问题: 首先,我刚刚向我的 UIViewController 添加了一个 UITableView。我选择它来显示它的框架,没有问题。 接下来,当我将按钮连接到 UIViewC
当我打开侧边栏时,我的背部 Activity 应该变小,我该如何实现? 最佳答案 嘿,你也可以为较小的 Activity 提供最佳效果。检查ResideMenu 库演示。非常适合您的回答 关于andr
我正在尝试以编程方式创建一个 TableView 单元格原型(prototype)(类似于下面的原型(prototype))。 设计了具有两个堆栈 View 的单元格, a) 包含文本标签的垂直堆栈
如何让td(highlighted)变小?我尝试将 witdh 设置为等于 50px 但不能显示更小的宽度 最佳答案 由于您使用的是表格,因此如果您希望整列为 50px,则需要将每一行中的每个 td
似乎在 UIWebView 上使用 sizeToFit() 不会将大小更改为更小,只会更大。这是一些设置代码: var scrollView: UIScrollView! var webView: U
我们发现了 iPhone 渲染斜体标签的问题。当为它定义的 font-family 不同于其父级的 font-family 时,斜体文本呈现的比它应该的小得多。该问题似乎并未出现在所有 iOS 设备上
我创建了一个具有以下特征的 AVD:目标:Android Honeycomb(API 级 Honeycomb)SD卡大小:64M皮肤:内置 WXVGA 但问题是,当我运行这个 ADV 时,它的尺寸比我
是否可以在 Activity xml 中使默认的 TimePicker 更小?我已经搜索过这个但到目前为止只发现了如何创建一个我不想做的自定义时间选择器,或者创建一个我也不想做的弹出窗口。有没有人
UIRefreshControl 使用非常大的微调器: 我想调整它的大小(微调器的框架,而不是下拉长度!)看起来更像这样: 我在 the reference docs 中看不到任何内容关于如何做到这一
我想在打开Navigation Drawer时让我的后台Activity变小一点,模拟Airbnb应用中存在的效果.我想最好的解释是截图: 但重点不是让View只是变小,而是让它成为一个与Drawer
我开发的其中一个网站有点问题。这个问题很简单,但是解决方案似乎有点难。 问题 问题是页面最初在移动设备上呈现时应该呈现的样子,但在页面加载完成后,页面会立即调整大小以适合视口(viewport)。没什
我有一个简单的水平 LinearLayout,里面有四个相同样式的 TextView。当 TextView 中的文本需要两行时,TextView 变小: 我不明白为什么。有人可以帮忙吗? 谢谢 布局
我需要一些建议来构建一个好的模型来使用 Collaborative Filtering 进行推荐。的 Spark 。 official website中有示例代码.我还通过了以下内容: from py
这里我有一个用于输入区域的简单的 buildPanel 方法。我尝试使用 GridLayout(7,1),但前 4 个 JTextField 似乎填满了其 block 的整个空间,看起来相当难看。 有
需要明确的是:我知道如何更改文本的大小,我想更改文本的粗细而不更改字体。这可能吗? 下面的代码是使“文本”一词出现在 Canvas 中间的基本代码。我需要更改或添加什么才能使文本厚度变薄? funct
我是 iOS 的初学者,所以我不确定要在这里研究什么。我有一个添加了几个方形 subview 的 UIScrollView。如何让 subview 在滚动出屏幕时变小,在接近屏幕中心时变大? #imp
我正在开发一个 Angular 应用程序,我需要对一个选择元素进行模式验证。仅在 select 上使用 ng-pattern 是行不通的。所以我在隐藏输入上创建了一个具有相同模型和 ng-patter
我在“语言页面”上有 3 个 ImageButton,代表应用程序 (Android) 的 3 种不同语言。
我得到的 CoordinatorLayout 的结构类似于: ... ... almost all elemen
我刚开始在我的 android 应用程序中使用 Snackbar,但我无法将 ScrollView 缩小到不覆盖 ScrollView 内部的任何内容。 这是我的 Activity 的 xml 布局:
我是一名优秀的程序员,十分优秀!