让用户裁剪图像

Dat*_*shi 7 android crop android-intent

我很难弄清楚如何让用户裁剪图片.我想给位图变量加载位图以在将其设置为壁纸之前裁剪图片.但我没有这样做......这就是我尝试过的.

第一版.=按预期工作但返回的图像分辨率较差.将输出更改为更高的值无济于事.正如我在一些帖子中看到的那样,不建议使用相机,因为并非所有设备都支持此功能.

Intent intent = new Intent("com.android.camera.action.CROP");  
String path = Images.Media.insertImage(context.getContentResolver(), loaded,null, null);
Uri uri = Uri.parse(path);              
intent.setData(uri);  
intent.putExtra("crop", "true");  
intent.putExtra("aspectX", 1);  
intent.putExtra("aspectY", 1);  
intent.putExtra("outputX", 300);  
intent.putExtra("outputY", 300);  
intent.putExtra("noFaceDetection", true);  
intent.putExtra("return-data", true);                                  
startActivityForResult(intent, 2);
Run Code Online (Sandbox Code Playgroud)

第二.加载图像选择器,然后裁剪.如何将其配置为直接在我的图像上加载裁剪?就像在版本1中一样

Intent photoPickerIntent = new Intent(MediaStore.ACTION_PICK);
photoPickerIntent.setData(uri);
photoPickerIntent.putExtra("crop", "true");
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(photoPickerIntent, 2);
Run Code Online (Sandbox Code Playgroud)

并且onActivity结果

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) { return; }
    if(requestCode == 2) {
        Bundle extras = data.getExtras();  
        if(extras != null ) {  
            Bitmap photo = extras.getParcelable("data");  
            loaded = photo;
        }
        WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());

        try {
            myWallpaperManager.setBitmap(loaded);
        } catch (IOException e) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道这些是完成这项工作的正确方法,但我希望有人能指出我正确的方向.哪个,为什么以及如何使用.

更新:我还在等待有人指出如何正确地做到这一点,下面的答案正在工作,但返回的图像分辨率很低,因此它们不是一个可供选择的选项

Thr*_*bad -2

我在使用相机时也遇到了问题,ACTION_PICK尽管传递的分辨率要大得多,但返回的图像非常小。我解决了这个问题,将生成的裁剪图像存储在临时文件中

// temporary storage location, preferably in your cache directory
private final String tempFilePath = "somePath";

// URI instantiated with your temporary storage location
private Uri tempuri = Uri.fromFile(new File(tempFilePath));

// code for startActivityForResult
private final static int ACTIVITY_CROP_IMAGE = 1;
Run Code Online (Sandbox Code Playgroud)

并像这样调用意图

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
photoPickerIntent.putExtra("crop", "true");
photoPickerIntent.putExtra("aspectX", wallpaperWidth);
photoPickerIntent.putExtra("aspectY", wallpaperHeight);
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri);
photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(photoPickerIntent, ACTIVITY_CROP_IMAGE);
Run Code Online (Sandbox Code Playgroud)

然后在onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    if (resultCode != RESULT_OK) 
        return;

    if(requestCode == ACTIVITY_CROP_IMAGE) 
    {
        try 
        {
            Bitmap bmp = BitmapFactory.decodeFile(tempFilePath);
            if(bmp != null)
            {
                WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
                myWallpaperManager.setBitmap(bmp);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        finally
        {
            if(tempFilePath != null)
            {
                File tempFile = new File(tempFilePath);
                if(tempFile.exists())
                {
                    tempFile.delete();
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从头开始构建了上面的代码,但实际上并没有编译任何代码。但基础知识是正确的,你应该掌握窍门;-)