【问题标题】:Compress images without reading into memory压缩图像而不读入内存
【发布时间】:2017-03-29 03:00:31
【问题描述】:

我在 sd 卡上有一个大图像文件,我想在上传到服务器之前对其进行压缩。但是要使用Bitmap.compress(CompressFormat format, int quality, OutputStream stream)压缩图像,我们需要将图像读入内存并保存压缩版本。 有没有办法在不将位图读入内存的情况下生成图像的压缩版本。

我正在使用以下代码进行压缩。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;

Bitmap finalBitmap = BitmapFactory.decodeFile(originalFile.getAbsolutePath(), options);    

File local = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),  "/my_images");
local.mkdirs();
File compressedFile = new File(local, "test.jpg");
FileOutputStream out = new FileOutputStream(compressedFile);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);

【问题讨论】:

  • 将位图保存到磁盘并压缩文件。
  • 图像已保存在磁盘上,大小约为 100MB。所以我不想将位图加载到内存中,因为它会导致 OOM。我需要的是创建一个压缩版本的文件,以优化上传时间。
  • 您以哪种格式上传图片?
  • 首先在设备上压缩图像有什么价值吗?我的意思是把它上传到服务器并在需要时压缩它——它肯定会有非常优越的资源吗?
  • 100mb?图片的分辨率是多少?

标签: android android-bitmap image-compression


【解决方案1】:

BitmapFactory 可以在从磁盘读取时调整图像文件的大小。你最终得到一个小位图。然后将该位图压缩到文件并上传该文件。

【讨论】:

  • 我不想缩小图像,而是需要对原始比例图像进行一些压缩以减少大小/上传时间。
  • jpeg 是您可以在移动端执行的最佳压缩。即使在那之后,如果它是 100 mb,那么你生成图像的方式就有问题@Ammar
  • I need to have original scale image with some compression to reduce size/upload time. 。不可能的。 jpg 已经被最大压缩。只有降低质量才能减小尺寸。但为此,您首先必须创建那个不可能的位图。你提出问题的方式太糟糕了。
  • @MohammedAtif 我已更新问题以包含我用于压缩图像的代码。问题不在于什么是最好的压缩方法。问题是如何在不从图像文件加载位图的情况下进行 jpeg 压缩。
  • @greenapps 输入图片可以是任何东西,不一定是JPG。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
相关资源
最近更新 更多