【问题标题】:Camera Capture Image is not clear(Blurry) in AndroidAndroid中的相机捕获图像不清晰(模糊)
【发布时间】:2015-12-11 18:05:17
【问题描述】:

我的相机捕捉图像有问题。它的设置模糊。

我搜索了很多,但我找不到解决方案

我不知道如何解决问题

这是我用于相机捕获图像的代码

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_FILE)
            onSelectFromGalleryResult(data);
        else if (requestCode == REQUEST_CAMERA)
            onCaptureImageResult(data);
    }
}

private void onCaptureImageResult(Intent data) {
    Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 0, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".jpg");

    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


  img1.setImageBitmap(thumbnail);
}

@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {
    Uri selectedImageUri = data.getData();
    String[] projection = {MediaStore.MediaColumns.DATA};
    Cursor cursor = managedQuery(selectedImageUri, projection, null, null,
            null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
    cursor.moveToFirst();

    String selectedImagePath = cursor.getString(column_index);

    Bitmap bm;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(selectedImagePath, options);
    final int REQUIRED_SIZE = 200;
    int scale = 1;
    while (options.outWidth / scale / 2 >= REQUIRED_SIZE
            && options.outHeight / scale / 2 >= REQUIRED_SIZE)
        scale *= 2;
    options.inSampleSize = scale;
    options.inJustDecodeBounds = false;
    bm = BitmapFactory.decodeFile(selectedImagePath, options);

    img1.setImageBitmap(bm);

}

图库图像在 Imageview 中设置良好,但仅在 CameraCapture Imageview 中发生 Camera Capture Image is not clear(Blurry) in Android

帮我解决这个问题。

提前致谢

【问题讨论】:

    标签: android image bitmapimage android-camera-intent blurry


    【解决方案1】:

    你的问题来了

    thumbnail.compress(Bitmap.CompressFormat.JPEG, 0, bytes);
    

    .compress() 方法中的第二个参数是质量,可以在 0..100 范围内。 您已将其设置为 0 -> 最大压缩。

    将值更改为更高的值。

    【讨论】:

      【解决方案2】:

      您正在做的是从意图数据中获取缩略图,这就是它模糊的原因

      试试这个: File mImageFile 是您要存储相机图像文件的路径。

          mImageFile= new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM" + File.separator + "temp.png"); 
      
      Uri tempURI = Uri.fromFile(mImageFile);
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      i.putExtra(MediaStore.EXTRA_OUTPUT, tempURI);
      activity.startActivityForResult(i, CHOOSE_CAMERA_RESULT);
      
      
      then in your onActivityResult
      
      @Override
      public void onActivityResultRAW(int requestCode, int resultCode, Intent data)
      {
          super.onActivityResultRAW(requestCode, resultCode, data);
          switch(requestCode)
          {
          case CHOOSE_CAMERA_RESULT:
          {
              if (resultCode == RESULT_OK)
              {
                  // here you image has been save to the path mImageFile.
                  Log.d("ImagePath", "Image saved to path : " + mImageFile.getAbsoultePath());
              }
          }
          break;
          }
      }
      

      【讨论】:

      • 我有两个选项画廊或相机所以我该如何修改它。帮我修改这个。@dex
      • 意图意图 = 新意图(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(意图,REQUEST_CAMERA);我用它来打开相机@dex
      • @RushangPrajapati :一旦你点击相机按钮,调用 startCamera 活动代码,一旦点击结束,然后在 OnActivityResult 你可以得到图像......相应地处理。对于画廊,您可以通过 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 调用画廊意图.addCategory(意图.CATEGORY_OPENABLE); intent.setType("图片/*"); startActivityForResult(intent, Gallery_code) ,然后在 onActivityResult 中你会得到 URI , openInputStream 从那个uri得到图像的位图。
      • mImageFile 是您将存储捕获图像的路径。例如 mImageFile= new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM" + File.separator + "temp.png");表示捕获图像将存储在 /sdcard/DCIM/ 文件夹中。你可以给出任何路径。
      • 我设置了所有东西,但它显示“位图太大,无法上传到纹理中(3120x4160,max=4096x4096)”如何压缩位图??
      【解决方案3】:

      当您尝试从 onActivityResult 中的 data.getExtras 对象获取位图时,它会返回低质量的位图,以下解决方案是完整的后续 Android 文档。不要忘记在 Manifest 中写入权限。

      lateinit var currentPhotoPath: String
      var photoFile: File? = null
      private fun takePhotoFromCamera() {
          Intent(MediaStore.ACTION_IMAGE_CAPTURE)
              .also { takePictureIntent ->
                  photoFile = try {
                      createImageFile()
                  } catch (ex: IOException) {
                      null
                  }
      
                  photoFile?.also {
                      fileUri = FileProvider.getUriForFile(
                          this, "com.example.fileprovider",
                          it
                      )
                      AppLogger.d("asad_fileUri", "$fileUri")
                      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
                      startActivityForResult(takePictureIntent, CommonUtils.CAMERA)
                  }
              }
      
      }
      
      
      override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
          try {
              if (requestCode == CommonUtils.CAMERA) {
                  galleryAddPic()
                  setPic()?.let {
                      fileUri = getImageUri(this, it)
                  }
                  postImagesAdapter.addItems(
                      listOf(PostImagesModel(fileUri.toString(), false, fileUri)), false
                  )
      
              } catch (e: Exception) {
              Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                  .show()
          }
          super.onActivityResult(requestCode, resultCode, data)
      }
      
      // File path xml
      <?xml version="1.0" encoding="utf-8"?>
      <paths xmlns:android="http://schemas.android.com/apk/res/android">
          <external-files-path name="my_images"
              path="/" />
      </paths>
      
      //AndroidManifest
      <provider
              android:name="androidx.core.content.FileProvider"
              android:authorities="com.example.fileprovider"
              android:exported="false"
              android:grantUriPermissions="true">
              <meta-data
                  android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/file_path"></meta-data>
          </provider>
      

      Take Photos

      【讨论】: