如何“智能调整大小”显示图像与原始长宽比
我有一个应用程序,最终用户可以在设计器中调整图像的大小和位置。由于规范要求将图像“拉伸”到包含控件,因此最终用户最终可能会得到一个难以拉伸的图像。
为了帮助用户调整图像大小,我正在考虑实现智能缩放功能,该功能将允许用户轻松固定图片的长宽比,使其不再显得拉伸。
解决这个问题的快速方法是实际上提供两个选项:1)从宽度缩放2)从高度缩放。用户选择方法,算法使用原始长宽比调整图片的大小。例如:图片在设计器上显示为 200x200,但原始图像为 1024x768 像素。用户选择“宽度智能尺寸”,新尺寸变为〜200x150,因为原始宽高比为〜1.333,
没关系,但是我怎样才能使算法更智能,而不是通过询问重新计算应基于哪个尺寸来打扰用户?
I have an application in which end-users can size and position images in a designer. Since the spec calls for the image to be "stretched" to the containing control, the end user can end up with an awkwardly stretched image.
To help the user with image sizing I am thinking of implementing a smart resizer function which would allow the the user to easily fix the aspect ratio of the picture so that it no longer appears stretched.
The quick way to solve this is to actually provide two options: 1) scale from width 2) scale from height. The user chooses the method and the algorithm adjusts the size of the picture by using the original aspect ratio. For example: A picture is displayed as 200x200 on the designer but the original image is 1024x768 pixels. The user chooses "Smart Size from width" and the new size becomes ~200x150 since the original aspect ratio is ~1.333
That's OK, but how could I make the algorithm smarter and not bother the user by asking which dimension the recalculation should be based on?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
计算两种变体的新尺寸(“按宽度缩放”和“按高度缩放”),然后使用适合显示的尺寸。
或者,您也可以计算“边界框”的长宽比,并将其与原始图像的长宽比进行比较。根据哪个纵横比较大,需要缩放高度或宽度。
您还可以限制调整大小过程,以便在所有情况下都完成“按宽度缩放”。然后,要更改图像的大小,用户始终必须更改其宽度。高度将始终自动调整。
Calculate the new dimensions for both variants ("scale by width" and "scale by height"), then use the one that fits in the display.
Alternatively you could also calculate the the aspect ratio of the "bounding box" and compare it against the aspect ratio of the original image. Depending on which aspect ratio is larger, the height or the width needs to be scaled.
You also could restrict the resize process so that in all cases "scale by width" is done. Then, to change the size of the image, the user always has to change its width. The height will always be adjusted automatically.
采纳上面的建议并使其在最大高度/宽度内放大/缩小。这里是它的Python代码,并且还添加了对旋转事物的支持,同时保持在限制范围内:
def _resize(image,dimensions,rotate=None):
”“”
将图像大小调整为尽可能接近指定尺寸。图像是一个
Django 图像模型字段。
Took the suggestion above and made it scale up/down within max height / width. Here the python code for it and also added support for rotating things while keeping within limites:
def _resize(image, dimensions, rotate=None):
"""
Resizes an image to be as close as possible to specified dimensions. Image is a
django image-model-field.
因为您希望在窗口中(即设计器中的区域)最大化显示(原始图像)的缩放图像,所以您将采用原始图像的宽度或高度中的较大者,并将其缩放到 200伪代码(宽度、高度为原始尺寸):
Because you want to maximize showing as much as possible the scaled image (of the original) in your window, i.e. the area in your designer, you would take the larger of either the width or height of the original image, and scale that to 200. Pseudo-code (width, height are dimensions of original):
这是我的解决方案,
a =方面
sw = 原始图像宽度
sh = 原始图像高度
dw = 请求的最大宽度
dh = 请求的最大高度
sw 和 sh 将包含最终调整大小的值
代码是 PHP:
here is my solution,
a = aspect
sw = original image width
sh = original image height
dw = requested max width
dh = requested max height
sw and sh will contain the final resized values
code is PHP:
我的解决方案是基于 https://stackoverflow.com/a/5654847/1055015 在 JavaScript 中缩小和增大大小
My solution to shrink and grow size in javascript based on https://stackoverflow.com/a/5654847/1055015
您只需计算出两个尺寸所需的比例,然后取 2 中较小的一个即可。
You just need to work out the scale needed for both dimensions and then take the smaller of the 2.
我用这种方法将图像大小调整为 FHD,
您可以将 1080 更改为新大小。
我希望它至少对某人有用。
I used this way to resize the image to FHD way
you can change the 1080 to the new size.
I hope it's useful for someone at least.
如果我正确地解释了您的规范,您希望得到的结果不大于最终用户最初布置的结果;您希望两个维度之一缩小,而另一个保持不变。换句话说,新尺寸应在一个方向上填充设计者空间,同时缩短另一方向上的尺寸以保留原始的宽高比。
通常您会使用整数坐标,但产生上述比率的除法需要是浮点型。下面是对公式的重新排列,使其对整数更加友好。确保您的整数具有处理最大宽度*高度的范围。
If I'm interpreting your spec correctly, you want a result that is no larger than the one the end-user laid out originally; you want one of the two dimensions to shrink, and the other to stay the same. In other words, the new size should fill the designer space in one direction while shortening the size in the other direction to retain the original aspect ratio.
Often you'll be working with integer coordinates, but the divisions to produce the ratios above need to be floating point. Here's a rearrangement of the formula to be more integer friendly. Make sure your integers have the range to handle the maximum width*height.
这是我在处理这个问题时想到的一个解决方案。在我看来,结果非常简短和直接,只是想分享它。
方便的“公式”:
ratio = W / H
→W = H *ratio
→H = W/ratio
在 Javascript
originalSize
和newSize
是一个数组[0] = width
,[1] = height
Here's a solution I came up with when having to deal with this problem. Turned out pretty short and straightforward imo, just wanted to share it.
Handy "formulas":
ratio = W / H
→W = H * ratio
→H = W / ratio
In Javascript
originalSize
andnewSize
is an array[0] = width
,[1] = height
我也想知道这一点,我看到的只是无数缩放宽度或高度的例子,但可能会让其他溢出。
。
I also wanted to know this and all I saw were endless examples of scaling width OR height but could leave the other overflowing.
.