2012-04-30 112 views
29

我有一個問題。當我試圖從相機獲取圖片時,質量非常低。 首先,使用相機捕捉圖片,而不是保存到目錄,同時獲取該圖片並顯示在我的應用程序中。保存在目錄中的圖片質量很好,但是當我從目錄中獲取圖片時,質量很低。以下是我的示例代碼:從相機捕捉時的低圖像/圖像質量

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

    if (requestCode == CAMERA_PIC_REQUEST) { 

     Bitmap thumbnail = (Bitmap) intent.getExtras().get("data"); 

     if (g==1) 
     { 
      ImageView myImage = (ImageView) findViewById(R.id.img5); 
      myImage.setImageBitmap(thumbnail); 

      View a = findViewById(R.id.img5); 
      a.setVisibility(View.VISIBLE); 

      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, stream); 

      byteArray1 = stream.toByteArray(); 
     } 
} 

任何解決方案/建議? 謝謝:)

解決

時,我遵循以下Antrromet

+0

我看不到您從任何地方的目錄中獲取照片?我所看到的只是使用附帶的縮略圖,順便說一下,這很容易出錯,因爲根據我的經驗,並非所有設備實際上都會返回任何「數據」。縮略圖顯然不會與存儲介質上的「完整」圖片具有相同的尺寸。 –

+0

其實我打電話給相機使用這個: 意圖cameraIntent =新的意圖(android.provider.MediaStore。ACTION_IMAGE_CAPTURE); \t \t \t \t \t \t startActivityForResult(cameraIntent,CAMERA_PIC_REQUEST); 你的建議然後避免錯誤?以及如何獲得圖片的實際大小? 感謝您的回覆:) – ckng

+0

最好的辦法可能是[提供輸出路徑](http://stackoverflow.com/a/7529603/1029225)與'相機'的意圖。另外,你也可以實現[你自己的圖片捕捉邏輯](http://stackoverflow.com/a/4855261/1029225)(更多的工作),或者可能使用['FileObserver'](http://developer.android。 com/reference/android/os/FileObserver.html)放在DCIM/Camera目錄下。 –

回答

70

我用下面的代碼中給出的代碼,這工作完全正常,我解決的問題。

  values = new ContentValues(); 
      values.put(MediaStore.Images.Media.TITLE, "New Picture"); 
      values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera"); 
      imageUri = getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
      startActivityForResult(intent, PICTURE_RESULT); 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 

     case PICTURE_RESULT: 
      if (requestCode == PICTURE_RESULT) 
       if (resultCode == Activity.RESULT_OK) { 
        try { 
         thumbnail = MediaStore.Images.Media.getBitmap(
           getContentResolver(), imageUri); 
         imgView.setImageBitmap(thumbnail); 
         imageurl = getRealPathFromURI(imageUri);  
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

       } 
     } 
    } 

public String getRealPathFromURI(Uri contentUri) { 
     String[] proj = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
+0

上面的代碼工作,但以某種方式在OnActivityResult() - > imageUri有時顯示爲空,即使我已經設置imageUri,而啓動CameraActivity。 @Antrromet – neaGaze

+0

^[已解決] - >在onCreate()方法中聲明imageUri和ContentValues,而不是onClick監聽器:D – neaGaze

+11

無法理解 - imageurl = getRealPathFromURI(imageUri); ? – NarendraJi

0

我會給你爲我工作的東西。我也是這樣問的!

Solution to save a picture in a specific folder without lost quality

我找到了解決辦法:

// 創建一個新的文件夾代碼:

String path = String.valueOf(Environment.getExternalStorageDirectory()) + "/your_name_folder"; 
      try { 
       File ruta_sd = new File(path); 
       File folder = new File(ruta_sd.getAbsolutePath(), nameFol); 
       boolean success = true; 
       if (!folder.exists()) { 
        success = folder.mkdir(); 
       } 
       if (success) { 
        Toast.makeText(MainActivity.this, "Carpeta Creada...", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception ex) { 
       Log.e("Carpetas", "Error al crear Carpeta a tarjeta SD"); 
      } 

      Intent i = new Intent(MainActivity.this, MainActivity.class); 
      startActivity(i); 
      finish();//agregue este 

// 方法來拍照

public void clickFoto(View view) { 
     takePic(); 
    } 

// takePic()

private void takePic() { 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     *File file = new File(Environment.getExternalStorageDirectory(), "/your_name_folder/a" + "/photo_" + timeStamp + ".png");* 
     imageUri = Uri.fromFile(file); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, PICTURE_RESULT); 
    } 

// onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 

      case PICTURE_RESULT: 
       if (requestCode == PICTURE_RESULT) 
        if (resultCode == Activity.RESULT_OK) { 
         try { 
          Bitmap thumbnail = MediaStore.Images.Media.getBitmap(
            getContentResolver(), imageUri); 
          imgFoto.setImageBitmap(thumbnail); 
          imageurl = getRealPathFromURI(imageUri); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

        } 
     } 
    } 

// getRealPathFromUri

public String getRealPathFromURI(Uri contentUri) { 
     String[] proj = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    }