如何找到适合预定尺寸的宽高比 4:3 的尺寸?

Posted

技术标签:

【中文标题】如何找到适合预定尺寸的宽高比 4:3 的尺寸?【英文标题】:How do I find a dimension of aspect ratio 4:3 which fits within a predetermined size? 【发布时间】:2009-09-02 09:49:27 【问题描述】:

这里的问题是我有一个大小为 x x y 的显示窗口,我需要在窗口内显示图像而不进行任何滚动,并保持 4:3 的纵横比。我有以下 sn-p 代码:

// Lock the current height, calculate new width of the canvas and scale the viewport.
// get width of the movie canvas
qreal width = canvas_->width();

// Find the height of the video
qreal height = (width/4.0) * 3;

// find original width and height for video to calculate scaling factor
qreal videoWidth = movieData_->GetWidth();
qreal videoHeight = movieData_->GetHeight();

// calculate scaling factor
qreal scaleFactorWidth = width/videoWidth;
qreal scaleFactorHeight = height/videoHeight;

当然,通过使用高度或宽度作为“锚点”,新图像会以一种或其他方式导致滚动(假设原始图像首先大于窗口)。如何找到适合预定尺寸的宽高比为 4:3 的尺寸?

编辑 我需要为 x 和 y 传入一个比例因子来进行缩放

canvas_->scale(scaleFactorWidth, scaleFactorHeight);

【问题讨论】:

【参考方案1】:

只需取两个计算值中的最小值:

scale = min(scaleFactorWidth, scaleFactorHeight)

或者(如果你想要外装)

scale = max(scaleFactorWidth, scaleFactorHeight)

【讨论】:

我不确定我是否理解;我需要 x 和 y 的比例因子。 @Extrakun,两者的比例因子相同,否则您最终会得到不成比例的图像。 对,scale_x = scale_y = scale。这是保持纵横比的唯一方法。【参考方案2】:
    struct dimensions resize_to_fit_in(struct dimensions a, struct dimensions b) 
        double wf, hf, f;
        struct dimensions out;

        wf = (double) b.w / a.w;
        hf = (double) b.h / a.h;

        if (wf > hf)
                f = hf;
        else
                f = wf;

        out.w = a.w * f;
        out.h = a.h * f;

        return out;

这里是 C 版本,其中返回的尺寸将是尺寸“a”,适合尺寸“b”,而不会丢失纵横比。

【讨论】:

【参考方案3】:

找出宽度w 和高度h 这两个值中的最大值。假设您的最大宽度 x 高度为 100 x 80。请注意,100/80 = 1.25。

案例 1:如果是 w/h > 1.25,则将 w 除以 100 得到原始尺寸与新尺寸的比率。然后将h 乘以该比率。

案例 2:否则,然后将 h 除以 80 以获得原始大小与新大小的比率。然后将w 乘以该比率。

【讨论】:

不,它不是正方形。我想我可能只是不断减小我想要的宽度,直到我得到一个适合预定尺寸的高度?【参考方案4】:

这是您所要求的 ActionScript 版本(在保持纵横比的同时调整大小)...应该不难移植到任何内容:

    private static function resizeTo(dispObj:DisplayObject, width:Number, height:Number) : void
    
        var ar:Number = width / height;
        var dispObjAr:Number = dispObj.width/dispObj.height;
        if (ar < dispObjAr)
        
            dispObj.width = width;
            dispObj.height = width / dispObjAr;
        
        else
        
            dispObj.height = height;
            dispObj.width = height * dispObjAr;
        
        return;
    

编辑:为了保持 4:3,源图像需要是 4:3

【讨论】:

以上是关于如何找到适合预定尺寸的宽高比 4:3 的尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

System.Drawing.Image 怎么调整Image的宽高?

获取上传图片的宽高尺寸

获取上传图片的宽高尺寸

关于元素尺寸问题的汇总

有关C# WPF里窗口尺寸的问题

08Flutter--页面布局