7

ユーザーに画像をトリミングさせる方法を理解するのに苦労しています。壁紙として設定する前に画像をトリミングするために、ビットマップがロードされたビットマップ変数を指定したいと思います。しかし、私はそうすることに失敗しています...これが私が試したことです。

最初のバージョン。=期待どおりに機能しますが、返される画像の解像度が低くなります。出力をより高い値に変更しても効果はありません。いくつかの投稿で見たように、すべてのデバイスがこれをサポートしているわけではないため、カメラの使用はお勧めしません。

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

2番。画像チューザーをロードし、後でトリミングします。画像に直接クロップをロードするようにこれを構成するにはどうすればよいですか?バージョン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);

そして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) {}
    }
}

これらがこれを行うための正しい方法であるかどうかはわかりませんが、誰かが私を正しい方向に向けてくれることを願っています。どの、なぜ、そしてどのように使用するか。

更新:私はまだ誰かがそれを正しく行う方法を指摘するのを待っています、以下の答えは機能していますが、低解像度で画像を返すので、それらは使用するオプションではありません

4

4 に答える 4

3

OK、親愛なるここで、Crop Image のコード全体を Android に入れました。これはグローバル変数です。

    //This For Image Crop
        /**
         *  Uri for set image crop option .
         */
        private Uri mImageCaptureUri;
        /**
         *  int for set key and get key from result activity . 
         */
        public final int CROP_FROM_CAMERA = 0;

/**
     * Bitmap for apply Crop Operation Result.
     */
    private Bitmap _tempOpration;

    //This is Crop Method.

/**
     * Method for apply Crop .
     * @param filePath -  String path of file .
     */
    private void doCrop(String filePath){
        try{
            //New Flow
            mImageCaptureUri = Uri.fromFile(new File(filePath));

            final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setType("image/*");
            List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );

            int size = list.size();
            if (size == 0) 
            {           
                Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();
                return;
            }
            else 
            {
                intent.setData(mImageCaptureUri);
                intent.putExtra("outputX", 300);
                intent.putExtra("outputY", 300);
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("scale", true);
                intent.putExtra("return-data", true);

                if (size == 1) 
                {
                    Intent i = new Intent(intent);
                    ResolveInfo res = list.get(0);
                    i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                    startActivityForResult(i, CROP_FROM_CAMERA);
                }

                else
                {
                    for (ResolveInfo res : list) 
                    {
                        final CropOption co = new CropOption();
                        co.title = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                        co.icon = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                        co.appIntent= new Intent(intent);
                        co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                        cropOptions.add(co);
                    }

                    CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Choose Crop App");
                    builder.setAdapter( adapter, new DialogInterface.OnClickListener()
                    {
                        public void onClick( DialogInterface dialog, int item )
                        {
                            startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA);
                        }
                    });

                    builder.setOnCancelListener( new DialogInterface.OnCancelListener() 
                    {
                        public void onCancel( DialogInterface dialog ) 
                        {
                            if (mImageCaptureUri != null ) 
                            {
                                getContentResolver().delete(mImageCaptureUri, null, null );
                                mImageCaptureUri = null;
                            }
                        }
                    } );
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            }
        }
        catch (Exception ex) 
        {
            genHelper.showErrorLog("Error in Crop Function-->"+ex.toString());
        }
    }

これは、アプリケーションで Crop Activity Intent を見つけるために使用する別のクラスです。

CropOption クラス。

public class CropOption 
{
    public CharSequence title;
    public Drawable icon;
    public Intent appIntent;
}

これは、表示リストに使用されます。

CropOptionAdapter

public class CropOptionAdapter extends ArrayAdapter<CropOption> 
{
    private ArrayList<CropOption> mOptions;
    private LayoutInflater mInflater;

    public CropOptionAdapter(Context context, ArrayList<CropOption> options) 
    {
        super(context, R.layout.crop_selector, options);

        mOptions    = options;

        mInflater   = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup group)
    {
        if (convertView == null)
            convertView = mInflater.inflate(R.layout.crop_selector, null);

        CropOption item = mOptions.get(position);

        if (item != null) {
            ((ImageView) convertView.findViewById(R.id.iv_icon)).setImageDrawable(item.icon);
            ((TextView) convertView.findViewById(R.id.tv_name)).setText(item.title);

            return convertView;
        }

        return null;
    }
}

CropOptionAdapter のレイアウト ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>
</LinearLayout>

これは、切り抜き画像を与える resultActivity.witch です。

/**
     * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) return;
        switch (requestCode)
        {
        case CROP_FROM_CAMERA:
            if (data == null) 
            {
                genHelper.showToast("No Crop Activity in This");
                return;
            }
            final Bundle extras = data.getExtras();
            if (extras != null) 
            {
                try 
                {

                    _tempOpration=extras.getParcelable("data");
                    imageLayout.setImageBitmap(_tempOpration);
                    _tempOpration=null;

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

    }

//Do This Type ライブ アプリでの作業です。

genHelper.showToast("これにはクロップ アクティビティはありません");

トーストメッセージとエラーログを表示するのに役立つ私の一般的なクラスです。

幸運を祈ります。

于 2013-03-07T05:12:15.917 に答える
2

まず、変数:

final int PIC_CROP = 2;

Uri imageUri;
Bitmap thePic;

カメラまたはギャラリーから写真を撮る前に、画像を Uri (imageUri) に入れ、try/catch 内で "performCrop()" としてここで呼び出されるメソッドを使用します。

 private void performCrop(){
        try {
            Intent intent = new Intent("com.android.camera.action.CROP"); 
            intent.setType("image/*");

            List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );
            int size = list.size();

            if (size >= 0) {
                intent.setData(imageUri);        
                intent.putExtra("crop", "false");
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("outputX", 256);
                intent.putExtra("outputY", 256);
                intent.putExtra("scale", true);  
                intent.putExtra("return-data", true);

                Intent i = new Intent(intent);
                ResolveInfo res = list.get(0);
                i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

                startActivityForResult(i, PIC_CROP);  
            } 

        }
        catch(ActivityNotFoundException anfe){
            String errorMessage = "Whoops - your device doesn't support the crop action!";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }

メソッド onActivityResult:

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

        if(requestCode == PIC_CROP){

        if (resultCode == RESULT_OK) {
            Bundle extras = intent.getExtras();
            thePic = extras.getParcelable("data");
            imageViewPhoto.setImageBitmap(thePic); //in my case, set the image on screen

        }else{
            //do something
        }
    }
}
于 2013-03-06T19:44:27.020 に答える
1

同様のスレッドで言及されているように、Android には公式のクロップ インテント ( https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html ) がないため、 「com.android.camera.action.CROP」を使用しないでください。

ただし、この質問が最初に投稿されてから、Android は Kitkat (レベル 19) に新しい API を追加しました。これにより、ユーザーは、crop-this-image-and-set-as-wallpaper アクティビティを呼び出すことができます。WallpaperManager.getCropAndSetWallpaperIntent() を参照してください。これにより、元の質問に対処できる場合があります。

于 2015-09-24T19:46:39.873 に答える
-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;

このようにインテントを呼び出す

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

そして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();
                }
            }
        }
    }
}

私は頭のてっぺんから上記のコードを作成しましたが、実際にはコンパイルしませんでした。しかし、基本は正しく、コツをつかむ必要があります;-)

于 2013-02-27T16:09:39.423 に答える