【问题标题】:Imageview cropping mechanism best approachImageview裁剪机制最佳方法
【发布时间】:2020-01-29 15:51:17
【问题描述】:

在 Android 中使用坐标系统从左侧/中心侧/右侧裁剪 100 X 100 位图图像的理想方法应该是什么?

假设左侧图像裁剪将提供 1/3 的图像,从坐标 0,0 [左下] 到 33,100 [右上]

右侧裁剪图像将为 66,0 到 100, 100

中心侧裁剪图像将为 33,0 到 66,0

【问题讨论】:

    标签: android algorithm matrix bitmap


    【解决方案1】:

    您可以查看裁剪的 Glide 或 Fresco 实现。 壁画可以做custom crop

    【讨论】:

      【解决方案2】:

      我认为最简单的方法是创建一个位图并通过创建一个新位图来裁剪该位图:

      Bitmap bitmap = ...; // your Bitmap
      Bitmap croppedBitmapLeft;
      Bitmap croppedBitmapCenter;
      Bitmap croppedBitmapRight;
      
      // Left side
      croppedBitmapLeft = Bitmap.createBitmap(bitmap, 0, 0, 33, 100);
      croppedBitmapCenter = Bitmap.createBitmap(bitmap, 33, 0, 33, 100);
      croppedBitmapRight = Bitmap.createBitmap(bitmap, 66, 0, 33, 100);
      

      See Bitmap.createBitmap() API

      【讨论】:

        【解决方案3】:

        如果您想bitmap 裁剪,请尝试Fresco 库。

        或者如果你对图像矩阵有足够的了解,你可以试试这个:

        final ImageView imageView = (ImageView) findViewById(R.id.imageView);
        final Matrix matrix = imageView.getImageMatrix();
        final float imageWidth = imageView.getDrawable().getIntrinsicWidth();
        final int screenWidth = getResources().getDisplayMetrics().widthPixels;
        final float scaleRatio = screenWidth / imageWidth;
        matrix.postScale(scaleRatio, scaleRatio);
        imageView.setImageMatrix(matrix);
        

        或者您可以自定义您的“ImageView”,例如:

        public class ImageViewTopCrop extends ImageView
        {
            public ImageViewTopCrop(Context context)
            {
                super(context);
                setScaleType(ScaleType.MATRIX);
            }
        
            public ImageViewTopCrop(Context context, AttributeSet attrs)
            {
                super(context, attrs);
                setScaleType(ScaleType.MATRIX);
            }
        
            public ImageViewTopCrop(Context context, AttributeSet attrs, int defStyle)
            {
                super(context, attrs, defStyle);
                setScaleType(ScaleType.MATRIX);
            }
        
            @Override
            protected boolean setFrame(int l, int t, int r, int b)
            {
                Matrix matrix = getImageMatrix();
                float scaleFactor = getWidth()/(float)getDrawable().getIntrinsicWidth();
                matrix.setScale(scaleFactor, scaleFactor, 0, 0);
                setImageMatrix(matrix);
                return super.setFrame(l, t, r, b);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-26
          • 2010-10-05
          • 2011-09-21
          • 1970-01-01
          • 2014-05-12
          • 2014-11-16
          • 1970-01-01
          • 2018-12-19
          相关资源
          最近更新 更多