从Facebook获取图像并写入SD时,图像质量非常低。

时间:2014-01-16 05:27:04

标签: java android facebook image

我从Facebook获取图像并将其写入SD卡,但图像质量非常低。以下是我的获取和写入代码:

try
        {
            URL url = new URL(murl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);

            data1 = String.valueOf(String.format(getActivity().getApplicationContext().getFilesDir()+"/Rem/%d.jpg",System.currentTimeMillis()));

            FileOutputStream stream = new FileOutputStream(data1);

            ByteArrayOutputStream outstream = new ByteArrayOutputStream();
            myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
            byte[] byteArray = outstream.toByteArray();

            stream.write(byteArray);
            stream.close();


        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

以下代码用于显示相同的图像:

                    File IMG_FILE = new File(IMAGE_CONTENT);
                    B2.setVisibility(View.INVISIBLE);
                    Options options = new BitmapFactory.Options();
                    options.inScaled = false;
                    options.inDither = false;
                    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                    Bitmap bitmap = BitmapFactory.decodeFile(IMG_FILE.getAbsolutePath(),options);
                    iM.setImageBitmap(bitmap);

即使使用选项,质量仍然很低。可以做些什么来改善这个?

2 个答案:

答案 0 :(得分:2)

将图片从网址保存到SD卡上使用此代码

try
{   
  URL url = new URL("Enter the URL to be downloaded");
  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
  urlConnection.setRequestMethod("GET");
  urlConnection.setDoOutput(true);                   
  urlConnection.connect();                  
  File SDCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile();
  String filename="downloadedFile.png";   
  Log.i("Local filename:",""+filename);
  File file = new File(SDCardRoot,filename);
  if(file.createNewFile())
  {
    file.createNewFile();
  }                 
  FileOutputStream fileOutput = new FileOutputStream(file);
  InputStream inputStream = urlConnection.getInputStream();
  int totalSize = urlConnection.getContentLength();
  int downloadedSize = 0;   
  byte[] buffer = new byte[1024];
  int bufferLength = 0;
  while ( (bufferLength = inputStream.read(buffer)) > 0 ) 
  {                 
    fileOutput.write(buffer, 0, bufferLength);                  
    downloadedSize += bufferLength;                 
    Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
  }             
  fileOutput.close();
  if(downloadedSize==totalSize) filepath=file.getPath();    
} 
catch (MalformedURLException e) 
{
  e.printStackTrace();
} 
catch (IOException e)
{
  filepath=null;
  e.printStackTrace();
}
Log.i("filepath:"," "+filepath) ;
return filepath;

使用此代码将SD卡图像设置为imageview bg

File f = new File("/mnt/sdcard/photo.jpg");
ImageView imgView = (ImageView)findViewById(R.id.imageView);
Bitmap bmp = BitmapFactory.decodeFile(f.getAbsolutePath());
imgView.setImageBitmap(bmp);

否则使用此

File file = ....
Uri uri = Uri.fromFile(file);
imgView.setImageURI(uri);

您可以直接在网上显示图片而无需下载。请检查以下功能。它会将网络上的图像显示在图像视图中。

public static Drawable LoadImageFromWebOperations(String url) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    } catch (Exception e) {
        return null;
    }
}

然后使用您活动中的代码将图片设置为imageview。

答案 1 :(得分:1)

问题在于您正在处理有损格式(JPG)并正在重新压缩图像。即使质量在100,你仍然会受到损失 - 你获得的金额最少。

您希望将原始字节直接下载到文件中,而不是解压缩到Bitmap,然后在将其写入文件时重新压缩。

...
InputStream is = connection.getInputStream();
OutputStream os = new FileOutputStream(data1);

byte[] b = new byte[2048];
int length;

while ((length = is.read(b)) != -1) {
    os.write(b, 0, length);
}

is.close();
os.close();
...