Android 根据宽高比确定新宽高

  今天遇到一个问题,要求图片大小不能超过4096 * 4096,如果超过此大小,需要进行压缩处理,为了不让图片失真,所以需要根据图片的宽高比来进行压缩。

思路

为使图片不失真,所以要根据宽高比来计算新宽高,求出宽高的最小公约数,然后减小公约数的值,使新公约数乘以宽高比小于最大尺寸。

实现步骤:

1. 获取宽高的最小公约数

2. 计算宽高比

3. 对比宽高,找出最大值,重新计算公约数

4. 根据新得到的公约数和宽高比来计算图片的宽高

/**
 * 计算压缩图片的宽高
 */
public void getCompressPicSize(){
    int gcd = getGCD(curPicWidth,curPicHeight);
    int ratioW = curPicWidth  / gcd;
    int ratioH = curPicHeight  / gcd;
    int newGCD;
    if(curPicWidth > curPicHeight){
        newGCD =  getOptimumGCD(ratioW);
    }else {
        newGCD = getOptimumGCD(ratioH);
    }
    int compressPicWidth =  newGCD  * ratioW; // 压缩后的宽高
    int compressPicHeight =  newGCD  * ratioH;
    Log.e("输出结果:", "最小公约数"+ gcd +"\n 比例为:" + ratioW +":"+ ratioH+"\n 新公约数为:" + newGCD +"\n 新宽高为:" + compressPicWidth +"-"+ compressPicHeight ); 
}
/**
 * 获取最小公约数
 * @param w 宽
 * @param h 高
 * @return
 */
public int getGCD(int w,int h){
    int result = 0;
    while (h != 0){
        result = w % h;
        w = h;
        h = result;
    }
    return w;
}
/**
 * 计算出最佳公约数
 * @param ratio
 * @return
 */
public int getOptimumGCD(int ratio){
    return  picMaxWH / ratio;
}

 

转载于:https://www.cnblogs.com/Ayinger/p/11078110.html

如果在 Android GridLayout 中添加了子控件,但它们的度和度都无法平均分配布局,则可能是因为您没有正确设置每个子控件的行和列的权重,或者您的子控件具有不同的度和度。 在 GridLayout 中,每个行和列都可以指定权重,以确定它们在布局中所占的比例。如果您不设置行和列的权重,它们将默认为0,这可能导致子控件无法平均分配空间。确保为每个子控件设置正确的行和列权重可以帮助您实现平均分配布局的目标。 另外,如果您的子控件具有不同的度和度,则可能需要使用 `GridLayout.LayoutParams` 的 `width` 和 `height` 属性为每个子控件设置确切的度和度。例如,以下代码演示了如何创建一个包含四个正方形子控件的 GridLayout: ``` GridLayout gridLayout = findViewById(R.id.grid_layout); gridLayout.setColumnCount(2); gridLayout.setRowCount(2); for (int i = 0; i < 4; i++) { TextView textView = new TextView(this); textView.setText("Text " + (i+1)); GridLayout.LayoutParams params = new GridLayout.LayoutParams(); params.width = 0; params.height = 0; params.columnSpec = GridLayout.spec(i % 2, 1f); params.rowSpec = GridLayout.spec(i / 2, 1f); textView.setLayoutParams(params); gridLayout.addView(textView); } ``` 在此示例中,`params.columnSpec` 和 `params.rowSpec` 用于设置行和列的权重,并将每个子控件放置在正确的行和列中。`params.width` 和 `params.height` 属性被设置为0,以便每个子控件都会平均分配空间,并且每个子控件都具有相同的大小。 确保为每个子控件设置正确的行和列权重,并为每个子控件设置确切的度和度可以帮助您实现平均分配布局的目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值