App Engine:通过从blobstore提供缩略图来计算要生成的缩略图的尺寸

Noa*_*ith 5 python google-app-engine thumbnails blobstore

我目前正在使用blobstore为图像生成缩略图,但是,我喜欢在img标记中存储缩略图的尺寸,因为这是一种很好的做法,有助于加快渲染速度并使部分加载的页面看起来更好一些.

如何只计算原始图像的尺寸,如何计算blobstore生成的缩略图的尺寸?

我以前的尝试并不是很准确,大部分时间都是一两个像素(可能是由于四舍五入).

我知道获取缩略图而不是使用图像API检查尺寸会起作用,但我认为效率低下.

这是我目前用来计算它的代码,然而,它偶尔偏离一个像素,导致浏览器稍微拉伸图像,导致调整大小的文物以及性能较差.

from __future__ import division
def resized_size(original_width, original_height, width, height):
    original_ratio = float(original_width) / float(original_height)
    resize_ratio = float(width) / float(height)
    if original_ratio >= resize_ratio:
        return int(width), int(round(float(width) / float(original_ratio)))
    else:
        return int(round(float(original_ratio) * float(height))), int(height)
Run Code Online (Sandbox Code Playgroud)

准确性非常重要!

Cli*_*int 4

我看到了问题所在。原因是 C 的 rint 被用来计算尺寸。Python 没有等效的 rint 实现,因为 Rossum 在 1.6 中取消了它:

http://markmail.org/message/4di24iqm7zhc4rwc

你现在唯一的办法就是用 python 实现你自己的 rint 。

默认情况下,rint 会执行“舍入为偶数”,而 pythons 会执行其他操作。这是一个简单的实现(没有 +inf -inf 等的边缘情况处理)

import math

def rint(x):
  x_int = int(x)
  x_rem = x - x_int  # this is problematic
  if (x_int % 2) == 1:
    return round(x)
  else:
    if x_rem <= 0.5:
      return math.floor(x)
    else:
      return math.ceil(x)
Run Code Online (Sandbox Code Playgroud)

上面的代码理论上应该是如何实现的。问题出在 x_rem 上。x - x_int 应该得到分数分量,但你可以得到分数 + delta。因此,如果需要,您可以尝试添加阈值

import math

def rint(x):
  x_int = int(x)
  x_rem = x - x_int
  if (x_int % 2) == 1:
    return round(x)
  else:
    if x_rem - 0.5 < 0.001:
      return math.floor(x)
    else:
      return math.ceil(x)
Run Code Online (Sandbox Code Playgroud)

在这里。我硬编码了 0.001 阈值。阈值本身就有问题。我想您确实需要尝试一下 rint 实现并将其适合您的应用程序,看看哪种效果最好。祝你好运!