【问题标题】:Save image in original form and without compressing以原始形式保存图像并且不压缩
【发布时间】:2017-07-19 05:48:04
【问题描述】:

我想保存图像而不压缩它,并希望以原始形式保存它,即当图像被压缩时,图像尺寸减小并且图像变小。为此,我正在使用本机相机。我在android studio 工作。我正在制作一个使用相机保存图像的应用程序。但是图像被压缩并且非常小并且质量非常低。

下面是我保存图片的代码

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

    final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
    {
        if(resultCode == Activity.RESULT_OK)
        {
            Bitmap bmp = (Bitmap)data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();

            bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            byte[] byteArray = stream.toByteArray();

            // convert byte array to Bitmap
            Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

            if(isStoragePermissionGranted())
            {
                SaveImage(bitmap);
            }


        }
    }else {
        switch (requestCode) {
            case 1000:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        getLocation();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(this, "Location Service not Enabled", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }

    }


}

private void SaveImage(Bitmap finalBitmap) {

    File storageDir = new File (String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)));
    String root = storageDir + Environment.getExternalStorageDirectory().getAbsolutePath().toString();
    Log.v(LOG_TAG, root);
    File myDir = new File(root + "/captured_images");
    if (!myDir .exists())
    {
        myDir .mkdirs();
    }
    Random generator = new Random();
    int n = 1000;
    n = generator.nextInt(n);
    String fname = "Image-" + n + ".jpg";
    File file = new File(myDir,fname);
    try {
        file.createNewFile();
        MediaScannerConnection.scanFile(getApplicationContext(), new String[]  {file.getPath()} , new String[]{"image/*"}, null);
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
        out.flush();
        out.close();

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

}

更新 1

为了更多的理解,我把我的onClick 方法

   btn_camera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Check permission for camera

            if(ActivityCompat.checkSelfPermission(MainActivity.this, CAMERA)
                    != PackageManager.PERMISSION_GRANTED)
            {
                // Check Permissions Now
                // Callback onRequestPermissionsResult interceptado na Activity MainActivity

                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{CAMERA},
                        MainActivity.REQUEST_CAMERA);
            }
            else {


                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );

            }


        }
    });

我搜索了解决方案,发现我可以使用AndroidBitmapUtil 类,所以我将这个class 复制并粘贴到我的项目中,即我创建了一个新类。但我不知道如何使用它。虽然据说我可以通过new AndroidBmpUtil().save(bmImage, file); 保存图像。但我又无法与我的代码匹配:(

任何帮助将不胜感激

【问题讨论】:

  • 相机应用程序将一个大文件保存到.../DCIM/Camera。但是您正在使用并保存图像的缩略图。因此质量低下。您应该提供相机应用程序将保存图像的相机意图的路径。基本的东西。你是问这个问题的####号。
  • @greenapps 请看我更新的代码

标签: android image android-camera android-bitmap


【解决方案1】:

new AndroidBmpUtil().save(source, sdcardBmpPath);

用户高于代码行并遵循以下链接

https://github.com/ultrakain/AndroidBitmapUtil

【讨论】:

  • 我已经弄清楚了一些事情并根据我的理解设置了代码,但是当我运行应用程序时它没有运行并给我错误Error:(39, 30) error: cannot find symbol method getWidth(),Error:(40, 31) error: cannot find symbol method getHeight(),Error:(62, 18) error: cannot find symbol method getPixels(int[],int,int,int,int,int,int) 这些都在AndroidBmpUtil 如果你知道如何解决这个问题,请告诉我。如果这个方法不能解决我的问题,我会尝试实现你提供的另一种方法
【解决方案2】:

打开相机并将图像保存到某个特定目录。

解决方案编号 1

private String pictureImagePath = "";

private void openBackCamera() {

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

String imageFileName = timeStamp + ".jpg";

File storageDir = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES);

pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;

File file = new File(pictureImagePath);

Uri outputFileUri = Uri.fromFile(file);

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);               

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

startActivityForResult(cameraIntent, 1);}

处理图片

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

if (requestCode == 1) {
File imgFile = new  File(pictureImagePath);

    if(imgFile.exists()){        

   Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

   ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);

   myImage.setImageBitmap(myBitmap);

    }
}

解决方案 2

我使用了以下代码,这对我来说非常好。

        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);
}

【讨论】:

  • 值是字符串类型?
  • 我将在onCreate方法中使用它。?
  • onclick方法内
  • 是的,亲爱的朋友..请接受我的回答并增加我的声誉:-)
  • 当我在做values = new ContentValues() 它给我错误不兼容的类型。我的声明是String values, imageUri
【解决方案3】:

用于打开相机使用

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 File f = new File(android.os.Environment.getExternalStorageDirectory(), "imagename.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, 1);

在你的 onActivityresult 方法中使用

if (requestCode == 1) {
 File f = new File(Environment.getExternalStorageDirectory().toString());
  for (File temp : f.listFiles()) {
   if (temp.getName().equals("imagename.jpg")) {
    f = temp;
     break;
  }
  }
  try {
   Bitmap bitmap;
   BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();

       bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),bitmapOptions);

      yourimageview.setImageBitmap(bitmap);

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

【讨论】:

  • 我可以在onClick 方法中打开相机我有` Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);`
  • 是的,没关系...但是我在打开相机时也在传递文件 uri。即..保存图像的位置。所以我猜它会在没有任何压缩的情况下保存
  • 我没有使用图像视图,所以在哪里传递bitmap?
  • 使用 imageview 并不可取。您可以使用 onActivityResult 方法中的那段代码在应用程序的任何位置获取图像,以获取位图格式的图像。
猜你喜欢
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2017-12-24
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多