【问题标题】:How To Scale And Crop An Image Programmatically Following Special Rules如何按照特殊规则以编程方式缩放和裁剪图像
【发布时间】:2021-05-25 08:41:33
【问题描述】:

我想在显示图像之前以特定方式缩放和裁剪图像 - 取决于其初始尺寸及其宽度和高度比例。最后,我希望图像填满整个可用屏幕。

以下是缩放和裁剪需要遵循的规则:

  1. 如果图像的宽度大于高度: a) 放大或缩小图像的高度以匹配屏幕的高度,但保持图像的初始宽度/高度比。 b) 在屏幕中居中图像。 c) 对称裁剪两边多余的宽度空间以匹配屏幕的宽度。

  2. 如果图像的宽度小于其高度: a) 放大或缩小图像的宽度以匹配屏幕的宽度,但保持图像的初始宽度/高度比。 b) 在屏幕中居中图像。 c) 对称裁剪两边多余的高度空间以匹配屏幕的高度。

我的意图是通过拉伸或收缩尺寸来填充整个屏幕,当与屏幕尺寸匹配时会导致其他图像尺寸超过屏幕尺寸,然后应该居中并对称裁剪。

我当前的代码使任何图像填满屏幕,但它没有保持原始的宽度/高度比,这会导致失真。 下面我给出相关代码:

Bitmap bmImg;
String[] PathsArray;
int numb_paths=0;
int position = 0;
ImageView imageView;
ViewFlipper flipper;
PathsArray = imagesPaths.split("\n");
numb_paths = PathsArray.length;
bmImg = BitmapFactory.decodeFile(PathsArray[position]);
imageView = new ImageView(displayImagesShow.this);
flipper = findViewById(R.id.flipper);
Resources r = getResources();
layers[0] = new BitmapDrawable(getResources(), bmImg);
layers[1] = r.getDrawable(R.drawable.flowers_frame1);
Drawable[] layers = new Drawable[2];
LayerDrawable layerDrawable = new LayerDrawable(layers);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageDrawable(layerDrawable);
ViewFlipper.LayoutParams lp =
        new ViewFlipper.LayoutParams
                (ViewFlipper.LayoutParams.MATCH_PARENT,
                        ViewFlipper.LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(lp);
flipper.addView(imageView);

【问题讨论】:

    标签: android image scale crop rules


    【解决方案1】:

    我自己找到了解决方案。它位于下面长长的“/”行之间:

    Bitmap bmImg,CroppedBmp;
    String[] PathsArray;
    int numb_paths=0;
    int position = 0;
    int wi,hi, wc, half_crop_dif, ;
    double ratioB
    ImageView imageView;
    ViewFlipper flipper;
    PathsArray = imagesPaths.split("\n");
    numb_paths = PathsArray.length;
    bmImg = BitmapFactory.decodeFile(PathsArray[position]);
    ///////////////////////////////////////////////////////////////
    wi = bmImg.getWidth();
    hi = bmImg.getHeight();
    ratioB = (double)wi/hi;
    if(ratioB>ratio)
    {
        wc = (int)(hi*ratio);
        half_crop_dif = (int)((wi-wc)/2.0);
        hi = (int)(hi*CORRECTION_FACTOR);
        CroppedBmp = Bitmap.createBitmap
                (bmImg, half_crop_dif,0,wc,hi);
        
    }
    else
    {
        hc = (int) (wi / ratio);
        half_crop_dif = (int) ((hi - hc )/ 2.0);
        CroppedBmp = Bitmap.createBitmap
        (bmImg, 0, half_crop_dif, wi, hc);
    }
    bmImg = CroppedBmp;
    
    ///////////////////////////////////////////////////////////////
    imageView = new ImageView(displayImagesShow.this);
    flipper = findViewById(R.id.flipper);
    Resources r = getResources();
    layers[0] = new BitmapDrawable(getResources(), bmImg);
    layers[1] = r.getDrawable(R.drawable.flowers_frame1);
    Drawable[] layers = new Drawable[2];
    LayerDrawable layerDrawable = new LayerDrawable(layers);
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setImageDrawable(layerDrawable);
    ViewFlipper.LayoutParams lp =
            new ViewFlipper.LayoutParams
                    (ViewFlipper.LayoutParams.MATCH_PARENT,
                            ViewFlipper.LayoutParams.MATCH_PARENT);
    imageView.setLayoutParams(lp);
    flipper.addView(imageView);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2015-04-20
      • 1970-01-01
      相关资源
      最近更新 更多