将图像转换为字符串的数据大小

Posted

技术标签:

【中文标题】将图像转换为字符串的数据大小【英文标题】:Data size on converting image to string 【发布时间】:2017-04-17 02:12:43 【问题描述】:

我正在尝试使用 android 应用程序中的 Base64 Android 类将图像转换为字符串,并且我成功获取了字符串。

但是当我检查大小为 86.13 kB 的图像的字符串长度时(使用 String.length)几乎是 85660。谷歌搜索后我知道这两个大小几乎相同。这意味着尽管我将图像转换为字符串,但不会发生数据缩减。

我的疑问是: 1)两个尺寸一样吗? 2)有没有其他方法可以将图像转换为字符串,所以我会减少数据。

我用于将图像转换为字符串的代码是

ByteArrayOutputStream baos=new  ByteArrayOutputStream();
imageSelected.compress(Bitmap.CompressFormat.PNG,100, baos);
byte [] b=baos.toByteArray();
String temp=Base64.encodeToString(b, Base64.DEFAULT);

请大家帮忙。提前致谢

【问题讨论】:

你正在使用(Bitmap.CompressFormat.PNG,100, baos) 100% 压缩,如果你减少它,那么它也会减少String 的大小。 哦...将尝试降低压缩百分比。感谢您的 cmets 目前还不清楚您认为图像的大小。您没有显示 86.13 KB 的来源。 @greenapps 使用此代码File file = new File("/sdcard/imageName.jpeg"); long length = file.length(); length = length/1024; 因此您将 jpg 文件的长度与 base64 编码的 png 文件的长度进行比较。这是一个奇怪的比较。顺便说一句:你为​​什么将 jpg 转换为 png? 【参考方案1】:

首先,将图像转换为 base64 字符串会增加而不是减小大小。这是因为 base 64 字符串每个字节将使用多个字符,这意味着图像中每个字节的字符串中有多个字节。

其次,你在比较错误的东西。您的设备上有一个 JPEG 文件。您打开它,然后将其压缩为 PNG - 这可能会增加大小,因为 PNG 是无损压缩而不是有损。然后,您对该 png 进行 base64 编码,并将其大小与磁盘上的 jpeg 进行比较?这根本没有意义。如果要比较,请将 base64 字符串的大小(以字节为单位)与输出流的长度进行比较——这将显示它大约 2 倍大,请参见第 1 点。

这就是通常不应使用 Base64 的原因。将二进制数据转换为文本数据以用于非二进制存储机制是一种技巧,并且仅应在绝对必要时使用 - 例如用于具有二进制数据的非多部分 HTTP 请求。它通常不应该用于存储,也不是压缩机制。

【讨论】:

我理解你的观点。但是有没有什么可以代替 Base64 的替代品?我会尝试比较你提到的尺寸。谢谢 要与字符串一致并缩小它?不会。对于相同的数据,二进制格式总是小于文本格式【参考方案2】:

您混淆了数据转换和数据压缩。将“图像”转换为字符串只是一种转换(将数据转换为另一种形式)而不是压缩。 如果要缩小图像的大小,则必须先对其进行压缩。你可以在这里找到更多信息:How to compress image size? 或者你可以用这个imageSelected.compress 方法玩得开心(将 CompressFormat 更改为 JPEG,将第二个整数更改为小于 100 的值等,直到你得到想要的效果)

【讨论】:

感谢@prezmyslaw 为您提供 cmets。会试一试 我不想压缩结果也是图像的图像,而是想将图像转换为大小更小的字符串格式

以上是关于将图像转换为字符串的数据大小的主要内容,如果未能解决你的问题,请参考以下文章

上传图像多部分表单 HTTPWebRequest - 将图像数据转换为字符串?

如何将 base64 字符串格式的图像转换为清晰图像缩小器期望的数据类型?

将图像转换为 JSON 时发生错误(数据损坏),反之亦然

将图像(按路径选择)转换为 base64 字符串

如何将存储在数据库中的 Base64 字符串集合转换为普通图像存储在本地目录中

如何从 JSON 字符串转换图像数据?