【问题标题】:Why downloaded image size is bigger than original?为什么下载的图片比原来的大?
【发布时间】:2020-09-17 20:06:03
【问题描述】:

我正在开发一个从网上下载.JPG图片的功能。

当我使用BitmapFactory.decodeStream()下载并保存在我的内部存储中时,文件大小比原始文件大。

原始图像文件(.JPG)大小为 114KB 我保存的文件大小是261KB

b = BitmapFactory.decodeStream(urlConnection.getInputStream()); //Download original image

FileOutputStream fos = openFileOutput("x.jpg", MODE_PRIVATE);

b.compress(Bitmap.CompressFormat.JPEG, 100, fos);

File ne = new File(getFilesDir()+"/x.jpg");

String l = ""+ Formatter.formatFileSize(MainActivity.this,ne.length())+"byte"//261KB

编辑:

InputStream is = urlConnection.getInputStream();

OutputStream outStream = MainActivity.this.openFileOutput("x.jpg", MODE_PRIVATE);

byte[] buf = new byte[1024]; int len = 0;
int total_len=0;

while ((len = is.read(buf)) > 0) {

outStream.write(buf, 0, len);
total_len+=len;

} 
is.close(); outStream.close();

//total_len = 116797 byte
//saved image file size = 116797 byte

Bitmap z = BitmapFactory.decodeFile(getFilesDir()+"/x.jpg");

img.setImageBitmap(z);

【问题讨论】:

标签: android android-image


【解决方案1】:

您不应先将 jpg 文件转换为位图。

废除 Bitmap 和 BitmapFactory。

在循环中将读取的字节直接保存到目标文件的 FileOutputStream。

然后您将尽可能多的字节写入下载的文件。

完成后,您的代码适合下载任何文件类型。

【讨论】:

  • 从 Bitmap.compress() 保存“图像文件”是否必不可少?以及如何从文件中读取图像?
  • 使用BitmapFactory.compress()存储图片不是必须的吗?如果我按照你说的做,如何读取图像文件并将其用作位图?
  • 那是一个完全不同的问题。您抱怨保存的 jpg 与原始文件的大小不同。我给了你一个解决方案。如果您以后想使用该文件制作位图,请稍后使用 decodeFile() 进行。
  • 我发布了它.. 非常抱歉浪费您的时间
  • 我做到了..!!现在原始大小为114KB,保存的图像大小为117KB。什么是3KB??只是假人?
【解决方案2】:

您将其设置为 100 质量,没有压缩。原始图像的压缩质量小于 100,但是当您解码流时,它会将其转换为未压缩的位图。当你以 100 的质量保存它时,它肯定会比原来的要好得多。

所以尝试b.compress(Bitmap.CompressFormat.JPEG, 70, fos);... 之类的方法,使其看起来不那么糟糕。一切如你所愿。

编辑:图片文件原封不动可以直接下载,看How to download file/image from url to your android app

【讨论】:

  • 感谢您的帮助。但是如果我想下载和保存关于原始质量和大小的图像该怎么办?
  • 在这种情况下,您可能需要知道压缩原始文件的压缩质量。但是你绝对不能,因为 JPEG 压缩级别没有普遍的定义。在一个软件中保存压缩级别为 60 的 JPEG 时的实际结果可能与另一个软件在设置为级别 60 时产生的结果有很大不同。所以我建议您设置自己的标准,使用合适的质量编号和使用标准你的目的。
  • 或者最好直接下载Image file而不将其转换为位图...你可能会看到stackoverflow.com/questions/9762057/…
  • 谢谢,我照你说的做了。现在原始文件 = 114kb,保存的文件 = 116kb。那么 2kb 只是虚拟值?
  • 很好,它可以按您的意愿工作。如果我的回答有帮助,请将其标记为答案并点赞。谢谢!
猜你喜欢
  • 2023-02-14
  • 2017-04-08
  • 2021-03-06
  • 2016-04-22
  • 2021-09-26
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多