Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么下载的图像比原始图像大?_Android_Android Image - Fatal编程技术网

Android 为什么下载的图像比原始图像大?

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

我正在开发一个从互联网下载.JPG图像的功能

当我使用
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);