2012-04-30 116 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); 
    }