在不移动叠加视图的情况下裁剪和缩放图像,而是在 ImageView 中移动图像

Posted

技术标签:

【中文标题】在不移动叠加视图的情况下裁剪和缩放图像,而是在 ImageView 中移动图像【英文标题】:Crop and Zoom Image without Moving Overlay View Instead Move Image in ImageView 【发布时间】:2014-08-05 11:51:33 【问题描述】:

您好,我想在不移动叠加视图的情况下裁剪图像,而不是移动图像。

图像可以四处移动。我想在黑色边框内裁剪并保存如下所示的突出显示区域。

我有ImageViewandroid:scaleType="matrix"

这是我的布局代码

<RelativeLayout
    android:id="@+imageEdit/rl_ScaleImage"
    android:layout_
    android:layout_
    android:layout_below="@+imageEdit/Topbar"
    android:visibility="visible" >

    <ImageView
        android:id="@+imageEdit/imageView1"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:scaleType="matrix" />

    <View
        android:id="@+imageEdit/viewTop"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:background="#99000000" />

    <View
        android:id="@+imageEdit/view_scaledImage"
        android:layout_
        android:layout_
        android:layout_above="@+imageEdit/viewBottom"
        android:layout_below="@+imageEdit/viewTop"
        android:background="@drawable/rounded_corner_small" />

    <View
        android:id="@+imageEdit/viewBottom"
        android:layout_
        android:layout_
        android:layout_alignParentBottom="true"
        android:background="#99000000" />
</RelativeLayout>

ImageViewOnTouchListener。图片可以放大或缩小,也可以在ImageView1中移动。查看view_scaledImage 是我要裁剪和保存的区域。我该怎么做?

【问题讨论】:

那么问题出在哪里? @Mann 如何裁剪view_scaledImage所涵盖的内容 How to crop an image in android?的可能重复 我也检查过,但这无法为我提供解决方案。请建议如何获得突出显示的坐标。你能提供一些代码吗 @Raj 你得到解决方案了吗?其实我也在寻找相同的..如果解决了,你能给我解决方案吗?提前致谢。 【参考方案1】:

最后我通过结合 Cropper 库和 PhotoView 库得到了解决方案。

https://github.com/rameshkec85/AndroidCropMoveScaleImage

【讨论】:

嗨 Ramesh Akula,我正在使用上面的库,它工作正常,但我面临一个问题。缩放时位图图像移动到叠加层之外?请帮助我提前致谢【参考方案2】:

您可以使用cropimage 库。将此行添加到您的清单文件中:

 <activity android:name="eu.janmuller.android.simplecropimage.CropImage" />

从图库或相机中选择图像并调用此函数:

public void runCropImage(String path) 
    Intent intent = new Intent(this, CropImage.class);
    intent.putExtra(CropImage.IMAGE_PATH, path);
    intent.putExtra(CropImage.SCALE, true);
    intent.putExtra(CropImage.ASPECT_X, 2);//change ration here via intent
    intent.putExtra(CropImage.ASPECT_Y, 2);
    startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);//final static int 1

在你的onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) 
    // gallery and camera ommitted
    case REQUEST_CODE_CROP_IMAGE:
        String path = data.getStringExtra(CropImage.IMAGE_PATH);
        // if nothing received
        if (path == null) 
            return;
        
        // cropped bitmap
         Bitmap bitmap = BitmapFactory.decodeFile(path);
        imageView.setImageBitmap(bitmap);
        break;
    default:
        break;
    

这个库也有缩放功能。检查我提到的链接中的示例

【讨论】:

让我给它一个机会【参考方案3】:

这是获取任何视图相对于当前窗口的坐标的方法:

public Rect getViewPositionRelative(View v) 
   //Locate on screen
   int[] location = new int[2];
   view.getLocationInWindow(location); //change to getLocationOnScreen(location) for an absolute positioning

   Rect rect = new Rect();
   rect.left = location[0];
   rect.top = location[1];
   rect.right = rect.left + v.getWidth();
   rect.bottom = rect.top + v.getHeight();
   return rect;

使用此方法,您可以获得 ImageView 和叠加视图的面积,然后使用一些基础数学计算裁剪面积;)

【讨论】:

以上是关于在不移动叠加视图的情况下裁剪和缩放图像,而是在 ImageView 中移动图像的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 缩放、缩放和裁剪图像

在 UIView 内缩放图像而不改变边界?

在 Swift 中从相机中裁剪图像而不移动到另一个 ViewController

UIScrollView 在不正确的点上缩放

如何在不使用内部相机裁剪的情况下裁剪图像

在不影响纵横比的情况下裁剪图像