Я хочу разработать свой код Android, чтобы уменьшить размер файла изображения, снимаемого с камеры, перед сохранением во внешнее хранилище

#android #image #camera

#Android #изображение #камера

Вопрос:

Я разработал простое приложение для камеры для Android. Теперь я хочу изменить это приложение, чтобы уменьшить размер снимаемого изображения с помощью камеры и сохранить изображение во внешнее хранилище. При этом я добавляю свой MainActivity.java скрипт. Как я могу изменить этот код, чтобы уменьшить размер изображения и сохранить во внешнее хранилище?

 public class MainActivity extends AppCompatActivity {

private static final int PERMISSION_CODE = 100;
private static final int IMAGE_CAPTURE_CODE = 101;
Button btnCapture;
ImageView imageCapture;

Uri image_uri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnCapture=findViewById(R.id.btnCapture);
    imageCapture=findViewById(R.id.imgView);

    btnCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                if(checkSelfPermission (Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED
                        || checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
                    String[] permission={CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};

                    requestPermissions(permission, PERMISSION_CODE);
                }
                else {
                    openCamera();
                }
            }
            else {
                openCamera();
            }
        }
    });
}
private void openCamera() {
    ContentValues values=new ContentValues();
    image_uri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);

    Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    camIntent.putExtra(MediaStore.EXTRA_OUTPUT,image_uri);
    startActivityForResult(camIntent, IMAGE_CAPTURE_CODE);

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    switch (requestCode){
        case PERMISSION_CODE:{
            if(grantResults.length>0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED){
                openCamera();
            }
            else {
                Toast.makeText(this,"Permission Denied",Toast.LENGTH_SHORT).show();
            }
        }
    }
}
} 
  

Комментарии:

1. Вы используете не javascript, а java. Ваш пост сбивает с толку.

2. тьфу. JavaScript так много лет назад назывался специально, чтобы люди путали его с java, который уже был очень успешным языком в то время, когда JS выходил. Тем не менее, удивительно видеть, что 24 года спустя люди все еще путают их.

Ответ №1:

сначала добавьте разрешение в свой манифест, затем вы можете записывать на SD-карту :

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  

и поэтому вам нужно получить свое растровое изображение. вы можете попытаться получить его из вашего ImageView imageCapture , например:

 BitmapDrawable drawable = (BitmapDrawable) mImageView1.getDrawable();
Bitmap bitmap = drawable.getBitmap();
  

вам нужно попасть в каталог с SD-карты

  File sdCardDir = Environment.getExternalStorageDirectory();
  
    // Next, create your specific file for image storage:
    File image = new File(sdCardDir , "myTest.png");
    //After that, you just have to write the Bitmap :
    boolean success = false;

    // Encode the file as a PNG image.
    FileOutputStream outStream;
    try {

        outStream = new FileOutputStream(image);

        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
        // 100 to keep full quality of the image 
        // You can reduce the size of the image if you decrease the value 

        outStream.flush();
        outStream.close();
        success = true;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (success) {
        Toast.makeText(getApplicationContext(), "Image saved with success",
                Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(getApplicationContext(),
                "Error during image saving", Toast.LENGTH_LONG).show();
    }
  

Ответ №2:

Вы не можете изменить поведение используемого намерения камеры и используемого приложения камеры.

Всегда полное изображение будет сохранено в предоставленном вами uri.

Если вы хотите изменить файл, вы можете сделать это только после этого.