当前位置: 首页 > 知识库问答 >
问题:

以原始形式保存图像,无需压缩

东门子昂
2023-03-14

我想保存图像而不压缩它,并希望以其原始形式保存它,即当图像被压缩时,图像大小减小,图像变小。我使用原生相机为此目的。我在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类,所以我复制并粘贴了这个类到我的项目中,也就是说,我创建了一个新类。但我不知道如何使用它。尽管有人说我可以通过执行new AndroidBmpUtil()来保存图像。保存(bmImage,file) 。但我还是无法匹配我的代码:(

任何帮助都将不胜感激


共有3个答案

澹台博文
2023-03-14

开放式摄像机使用

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();
  }
 }
袁秦迟
2023-03-14

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

解决方案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);
}
狄新立
2023-03-14

新的AndroidBmpUtil()。保存(来源:sdcardBmpPath);

用户在代码行上方,并遵循下面的链接

https://github.com/ultrakain/AndroidBitmapUtil

 类似资料:
  • 从远程url保存位图图像的典型方法(基于研究)是: 我无法保存位图,除非它被压缩(位图总是未压缩)。远程图像大小为32KB,压缩后为110KB。我知道我必须降低压缩参数以获得更小的尺寸,但远程图像经过优化,效率更高。 有没有一种方法可以在不压缩远程图像的情况下将其保存到移动存储上? 我的问题的答案===== 首先,我为误导内容道歉;我只想保存可以是png | jpeg | gif |等格式的图像。

  • 所以我正在尝试做一个标题图像改变器,比如当你点击一个图像来改变标题的样式,并在重新加载后保存它。例如:我有一个默认的图像使用一个样式在头部,当我按下按钮改变它,自动保存它,即使在刷新。 null null

  • 保存图像 能将图像保存至Memory Stick™或主机内存。 1. 让指针对准想要保存的图像,从选单列中选择[档案] > [保存图像]。 2. 选择[保存]。 提示 若想变更文件名或保存位置,请选择各项输入栏,并执行决定。

  • 问题内容: 好的,我已经尝试了几乎所有内容,但无法正常工作。 我有一个上面带有ImageField的Django模型 我有通过HTTP下载图像的代码(已测试并且可以工作) 图像直接保存到“ upload_to”文件夹中(upload_to是在ImageField上设置的文件夹) 我需要做的就是将已经存在的图像文件路径与ImageField相关联 我已经用6种不同的方式编写了这段代码。 我遇到的问题

  • 问题内容: 前一段时间,我做了一个python脚本来将数据存储在图像中,但是它有一个小问题,我只是想知道是否有人可以想到另一种方法。 一个非常基本的想法是它会腌制某些东西,然后在第一个版本中,它直接将ASCII数字写为像素(因为所有数字都在0到255之间)。这将导致图像看起来有点像电视噪音。 在写入实际图像时,它将检测到需要调整的每个像素的最小位数,因此它不会被人眼察觉,并且它将拆分数据并从每个像

  • 我在Android上工作。我需要保存一个没有质量损失的位图。 我使用位图的方法进行了尝试,将质量设置为100。这对我不起作用,位图失去了太多的质量。我已经测试了JPEG和PNG格式。 我已经测试过将位图复制到,然后提取,并使用保存它。在这种情况下,我无法显示用这种方式保存的图像,我只看到一个空白页。 我的问题是,有没有办法在不压缩的情况下将位图保存在SD卡中? 编辑:这里我的代码的一部分 我检测到