我想在将图像上传到服务器之前编写自己的压缩图像的代码。
我在 SO 上看到过很多类似 this 的帖子还有很多其他帖子,但到处都只有代码示例。它实际上没有在任何地方解释。我无法从给定的代码中理解。
我只是想知道压缩图片的整体方法,这样我就可以开始自己写代码了。
我不是在寻找代码,只是在寻找一个人压缩图像所需遵循的步骤。 (就像在编写程序之前先编写算法即伪代码)
最佳答案
我认为 Chetan Joshi 的回答是迄今为止最接近的。但要进一步解释,
“压缩”图像和“缩放”(调整大小)图像是不同的。由于您只是想在上传到服务器时减少网络带宽 (kb/Mb),您很可能在谈论“缩放”,因为这会对图像的大小产生最大的影响。
请注意,与其他 Android 答案一样,您需要使用 Bitmaps .您需要使用与位图关联的 API 调用来执行您想要的操作。
起点:
如果您允许您的应用使用相机拍照或从图库中挑选照片,您将获得一个 Uri,它允许您像这样打开一个 InputStream:
InputStream is = getContext().getContentResolver().openInputStream(photoUri);
这是第一步。下一部分是你想要这样的伪代码:
- 获取照片/所选图片的
InputStream
。这只是表示图像的字节流。 - 使用
BitmapFactory.decodeStream(InputStream src)
将流解码为位图
- 使用
Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter);
缩放(调整大小)位图。您必须自己决定目标宽度和目标高度。请参阅下一组伪代码。 - 使用
imageFormat.getBitmapCompressFormat(), 100, output)
压缩位图,其中 output 是ByteArrayOutputStream
的一个实例 - 您现在可以调用
output.toByteArray();
来获取字节。 - 字节是您要发送到服务器的内容。
关于如何选择要缩放到的目标宽度和高度的注意事项:
- 确定最大高度和最大宽度,例如 240 x 240。您将把它与位图的实际高度和实际宽度进行比较。
- 如果太高(实际高度 > 最大高度),计算最大高度/实际高度的比例因子
- 如果太宽(实际宽度 > 最大宽度),计算一个比例因子,即最大宽度/实际宽度
- 您的实际比例因子是这两个比例因子中的最小值
- 返回实际高度*缩放因子和实际宽度*缩放因子
总的来说,高级流程是这样的:
- 打开图像字节流
- 将字节转换为位图
- 缩放位图
- 压缩位图
- 将位图转换回字节
关于java - 在 Android 中压缩图像以上传到服务器的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930029/