Android 为什么下载的图像比原始图像大?
我正在开发一个从互联网下载.JPG图像的功能 当我使用Android 为什么下载的图像比原始图像大?,android,android-image,Android,Android Image,我正在开发一个从互联网下载.JPG图像的功能 当我使用BitmapFactory.decodeStream()下载并将其保存在内部存储器中时,文件大小比原始文件大 原始图像文件(.JPG)的大小为114KB 我保存的文件大小是261KB b = BitmapFactory.decodeStream(urlConnection.getInputStream()); //Download original image FileOutputStream fos = openFileOutput(&q
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
编辑:
你把它放在100质量,没有压缩。原始图像的压缩质量低于100,但当您解码流时,它会将其转换为未压缩的位图。当你以100倍的质量保存它时,它肯定会比原来的大得多 因此,尝试类似于
b.compress(Bitmap.CompressFormat.JPEG,70,fos)的方法代码>。。。达到一个不会让它看起来很糟糕的水平。这将是你想要的
编辑:如果您希望图像文件完整无缺,可以直接下载图像文件,请查看您不应该首先将jpg文件转换为位图
不要使用位图和位图工厂
在循环中,将读取的字节直接保存到目标文件的FileOutputStream
然后,您向文件中写入的字节数与下载的字节数相同
完成此操作后,您的代码适合下载任何文件类型。这对于从位图.compress()保存“图像文件”至关重要吗?如何从文件中读取图像?使用BitmapFactory.compress()存储图像不是很重要吗?如果我按照你说的做,我如何读取图像文件并将其用作位图?这是一个完全不同的问题。您在抱怨保存的jpg与原始jpg的大小不同。我给了你一个解决办法。如果您以后想使用该文件制作位图,请稍后使用decodeFile()进行操作。我发布了。。我很抱歉浪费了你的时间我做到了。。!!现在原始大小为114KB,保存的图像大小为117KB。什么是3KB??只是傻瓜?谢谢你的帮助。但是,如果我想下载并保存有关原始质量和大小的图像,我该怎么办?在这种情况下,您可能需要知道原始图像的压缩质量。但您肯定不能,因为JPEG压缩级别的定义并不普遍。在一个软件中保存压缩级别为60的JPEG时的实际结果可能与另一个软件设置为60级时产生的结果有很大差异。因此,我建议您设置自己的标准,使用合适的质量编号,并根据您的目的使用标准。或者,最好直接下载图像文件
,而不将其转换为位图。。。你可以看到,谢谢,我照你说的做了。现在,原始文件=114kb,保存的文件=116kb。那么2kb只是一个虚拟值?很好,它可以按照您的要求工作。如果我的答案有帮助,请将其标记为答案并投票表决。谢谢评论不用于扩展讨论;这段对话已经结束。
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);