如何在安卓系统中裁剪已解析的图像?

12

我正在解析一个网站以显示URL中的内容,其中包含一些图片。我想裁剪从网站解析出来的这些图片。我真的在这方面遇到了困难,有人可以帮助我吗?


我发现最好的图片裁剪库是Android-Image-Cropper。请参考这个答案 - Soon Santos
4个回答

24

我假设您已经从网站上下载了图片,并且想要进行缩放而不是裁剪?也就是说,创建缩略图。

如果是这样,您可以使用以下代码:

    // load the origial BitMap (500 x 500 px)
    Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), 
           R.drawable.android);

    int width = bitmapOrg.width();
    int height = bitmapOrg.height();
    int newWidth = 200;
    int newHeight = 200;

    // calculate the scale - in this case = 0.4f
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;

    // createa matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);

    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                      width, height, matrix, true); 

    // make a Drawable from Bitmap to allow to set the BitMap 
    // to the ImageView, ImageButton or what ever
    BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);

    ImageView imageView = new ImageView(this);

    // set the Drawable on the ImageView
    imageView.setImageDrawable(bmd);

    // center the Image
    imageView.setScaleType(ScaleType.CENTER);

工作得很好。不过我有一个问题:当Bitmap类是可变的时,它是否支持改变其大小?或者它只允许修改其数据?如果它可以改变大小,你会怎么修改你的代码以避免创建新的Bitmap? - android developer
1
只是提醒一下,不必创建一个调整大小的位图。您可以简单地将矩阵设置为imageView,然后设置位图。imageView将把矩阵应用于位图。 - Nelson Ramirez
1
这个是缩放,不是裁剪... 这个也不是非常准确。 - Huy Tower

3

Best link github -> AndroidImageCrop

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    photoPicker();
}

private void photoPicker() {
    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, 1);
}

private void crop(Uri photoUri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setData(photoUri);
    intent.putExtra("outputX", 200);
    intent.putExtra("outputY", 200);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("scale", true);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, RESULT_CROP);
}

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == RESULT_OK) {
        Uri photoUri = intent.getData();
        if (photoUri != null) {
            Log.i("TAG", "Start Crop!!");
            crop(photoUri);
        }
    } else if (resultCode == RESULT_CROP) {
        Toast.makeText(this, "Image crop", Toast.LENGTH_SHORT).show();
    }
}

2

Android联系人管理器EditContactActivity使用Intent("com.android.camera.action.CROP")

这是一段示例代码:

Intent intent = new Intent("com.android.camera.action.CROP");
// this will open all images in the Galery
intent.setDataAndType(photoUri, "image/*");
intent.putExtra("crop", "true");
// this defines the aspect ration
intent.putExtra("aspectX", aspectY);
intent.putExtra("aspectY", aspectX);
// this defines the output bitmap size
intent.putExtra("outputX", sizeX);
intent.putExtra("outputY", xizeY);
// true to return a Bitmap, false to directly save the cropped iamge
intent.putExtra("return-data", false);
//save output image in uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

接下来,使用startActivityWithResult()方法来判断用户是否按下了确定取消按钮。如果是前者,裁剪后的图片将会保存在uri中。


好主意,但“com.android.camera.action.CROP”不是官方的,可能不能在某些手机上工作。 - Oded Breiner
有官方版本吗? - noelicus

-3
<ImageView  android:id="@+id/title_logo"
            android:src="@drawable/logo"
            android:scaleType="centerCrop" android:padding="4dip"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接