java - 在 Android 中压缩图像以上传到服务器的过程

标签 java android image-compression

我想在将图像上传到服务器之前编写自己的压缩图像的代码。

我在 SO 上看到过很多类似 this 的帖子还有很多其他帖子,但到处都只有代码示例。它实际上没有在任何地方解释。我无法从给定的代码中理解。

我只是想知道压缩图片的整体方法,这样我就可以开始自己写代码了。

我不是在寻找代码,只是在寻找一个人压缩图像所需遵循的步骤。 (就像在编写程序之前先编写算法即伪代码)

最佳答案

我认为 Chetan Joshi 的回答是迄今为止最接近的。但要进一步解释,

“压缩”图像和“缩放”(调整大小)图像是不同的。由于您只是想在上传到服务器时减少网络带宽 (kb/Mb),您很可能在谈论“缩放”,因为这会对图像的大小产生最大的影响。

请注意,与其他 Android 答案一样,您需要使用 Bitmaps .您需要使用与位图关联的 API 调用来执行您想要的操作。

起点:

如果您允许您的应用使用相机拍照或从图库中挑选照片,您将获得一个 Uri,它允许您像这样打开一个 InputStream:

InputStream is = getContext().getContentResolver().openInputStream(photoUri);

这是第一步。下一部分是你想要这样的伪代码:

  1. 获取照片/所选图片的 InputStream。这只是表示图像的字节流。
  2. 使用BitmapFactory.decodeStream(InputStream src)将流解码为位图
  3. 使用 Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter); 缩放(调整大小)位图。您必须自己决定目标宽度和目标高度。请参阅下一组伪代码。
  4. 使用 imageFormat.getBitmapCompressFormat(), 100, output) 压缩位图,其中 output 是 ByteArrayOutputStream 的一个实例
  5. 您现在可以调用 output.toByteArray(); 来获取字节。
  6. 字节是您要发送到服务器的内容。

关于如何选择要缩放到的目标宽度和高度的注意事项:

  1. 确定最大高度和最大宽度,例如 240 x 240。您将把它与位图的实际高度和实际宽度进行比较。
  2. 如果太高(实际高度 > 最大高度),计算最大高度/实际高度的比例因子
  3. 如果太宽(实际宽度 > 最大宽度),计算一个比例因子,即最大宽度/实际宽度
  4. 您的实际比例因子是这两个比例因子中的最小值
  5. 返回实际高度*缩放因子和实际宽度*缩放因子

总的来说,高级流程是这样的:

  1. 打开图像字节流
  2. 将字节转换为位图
  3. 缩放位图
  4. 压缩位图
  5. 将位图转换回字节

关于java - 在 Android 中压缩图像以上传到服务器的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930029/

相关文章:

android - 声音不适用于 Android 设备。在模拟器上运行良好

java - 如何使用适用于 Android 的 OpenGL 2.0 绘制 UV 球体并对其进行纹理处理

java - 如何减少位平面代码的计算时间

python - 内存中 numpy 数组(图像、uint8)的有损压缩

c# - Java和c#之间的Web服务——复杂数据类型

java - 如何从 AES-256 切换到 AES-128?

java - 无法将 dex 与 google 的新地方 compat sdk 合并

java - play framework 2 ebean @manytoone 指定列两次

PHP 降低所有图像类型的质量

android - 禁用 editText 但颜色不同