在android中裁剪后保存图像

Posted

技术标签:

【中文标题】在android中裁剪后保存图像【英文标题】:save image after cropping in android 【发布时间】:2014-11-03 17:18:19 【问题描述】:

我正在尝试保存裁剪后的图像,并且已成功保存,但问题是保存的图像太小。我想获得裁剪图像的原始尺寸。这是我保存裁剪图像的代码。

Bundle extras = data.getExtras();
if (extras != null) 
 Bitmap photo = extras.getParcelable("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, bytes);
File f = new File(fileUri.getPath());
 try 
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
 catch (IOException e) 
e.printStackTrace();

任何人都可以帮助我获得高质量的裁剪图像。任何帮助将非常感激。谢谢:)

【问题讨论】:

你正在保存你得到的东西;具有该格式的最高质量。那里没什么可改进的。 我见过很多应用有高质量的裁剪图片,应该有办法的。 【参考方案1】:

这完全取决于原始图像的大小和您将图像裁剪成的大小。

一种裁剪方式是这样的:

               Intent photoPickerIntent = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                photoPickerIntent.setType("image/*");

                photoPickerIntent.putExtra("scaleType", "centerCrop");
                photoPickerIntent.putExtra("crop", "true");
                photoPickerIntent.putExtra("aspectX", 1);
                photoPickerIntent.putExtra("aspectY", 1);

                //....snip....
                photoPickerIntent.putExtra("outputX", 400);
                photoPickerIntent.putExtra("outputY", 400);
                //....snip....

                photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getBackgroundUri());
                photoPickerIntent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
                startActivityForResult(photoPickerIntent, ActivityCrop);

这样,您总是会得到一个大小为 400 像素(输出 = 400)的方形图像(纵横比 = 1)。 因此,如果您选择图像的 800 像素正方形,它将按比例缩小,从而降低质量。 相反,选择 50px 的正方形也会得到 400px 的结果。

现在,如果您取消大小限制(就在虚线处)。您将获得最初选择的区域(示例中为 800 和 50)并获得最佳质量。

【讨论】:

我怎样才能消除尺寸限制? 它们位于两个“snip”cmets 之间。额外的“outputX”和“outputY”设置此意图的输出大小。 额外的“outputX”和“outputY”的大小应该是多少,以消除大小限制。感谢您的回复,非常感谢:) 我的意思是完全省略这两行代码。这样您就可以准确地获得您在裁剪期间选择的内容。【参考方案2】:

发送带有纵横比和大小的裁剪意图

Intent cropIntent = new Intent("com.android.camera.action.CROP");

            cropIntent.setDataAndType(picUri, "image/*");

            cropIntent.putExtra("crop", "true");

            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);

            cropIntent.putExtra("outputX", 256);
            cropIntent.putExtra("outputY", 256);

            cropIntent.putExtra("return-data", true);

            startActivityForResult(cropIntent, PIC_CROP);

关于活动结果

if (requestCode == PIC_CROP) 

            Bundle extras = data.getExtras();
            Bitmap thePic = extras.getParcelable("data");

            BitmapDrawable drawable = (BitmapDrawable) i1.getDrawable();
            Bitmap bb11 = drawable.getBitmap();



            File sdCardDirectory = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    "MFA - AFTER - CROP");

            if (!sdCardDirectory.exists()) 
                if (!sdCardDirectory.mkdirs()) 
                    Log.d("MySnaps", "failed to create directory");

                
            

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

            String nw = "MFA_CROP_" + timeStamp + ".jpeg";

            File image = new File(sdCardDirectory, nw);

            boolean success = false;

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

                outStream = new FileOutputStream(image);
                bb11.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
                /* 100 to keep full quality of the image */

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


            b7.setEnabled(true);

        

快乐编码:)

【讨论】:

atline BitmapDrawable drawable = (BitmapDrawable) i1.getDrawable(); i1 是什么? i1 是我在编码中使用的 imageview 。这只是想知道该怎么做。 完美运行,不知道为什么你没有被支持。谢谢卡西尔【参考方案3】:

这是我的代码

            intent.setData(mImageCaptureUri);
			intent.putExtra("crop", "true");
			intent.putExtra("outputX", 320);
			intent.putExtra("outputY", 470);
			intent.putExtra("aspectX", 320);
			intent.putExtra("aspectY", 470);
			intent.putExtra("scale", true);
			intent.putExtra("return-data", true);

来自本站

Screen resolution for different devices

【讨论】:

以上是关于在android中裁剪后保存图像的主要内容,如果未能解决你的问题,请参考以下文章

裁剪图像并保存到 sdcard (Android) 中的特定文件夹?

为啥Android裁剪意图不返回ActivityResult?

在 Android 上即时裁剪图像

如何在 Android 相机上使用意图添加功能裁剪图像?

Android:在捕获或从图库中挑选后裁剪图像

裁剪Android后无法检索图像