text: from keras.preprocessing import image
  from keras.applications.vgg19 import preprocess_input
  import numpy as np
  import os
  import uuid
  from PIL import Image
  
  
  def get_file_extension(filename):
      if "." not in filename:
          return ""
  
      return filename.rsplit('.', 1)[1].lower()
  
  
  def allowed_file(filename):
      ALLOWED_EXTENSIONS = [
          "png",
          "jpg",
          "jpeg",
      ]
      return get_file_extension(filename) in ALLOWED_EXTENSIONS
  
  
  def preprocess_image(image_path):
      img = image.load_img(image_path, target_size=(224, 224))
      img = image.img_to_array(img)
      img = np.expand_dims(img, axis=0)
      img = preprocess_input(img)
      return img
  
  
  def save_upload_file(original_name, file):
      UPLOAD_DIR = "./dist/static/upload_images"
  
      _, ext = os.path.splitext(original_name)
  
      encrypted_name = str(uuid.uuid4()) + ext
  
      print(encrypted_name)
  
      file.save(os.path.join(UPLOAD_DIR, encrypted_name))
      return encrypted_name
  
  
  def get_image_scale(image_name):
      path = f"../mm_images/{image_name}"
      size = Image.open(path).size
      return size[1] / size[0]
  
  
  def re_arrange_images(image_names):
      """
          因为css是纵向排列的，但一般要横着看，所以这里把图片重新排序。
          (本来应该在前端写的，不过我不会写css，就代码改了)
      """
      image_scales = [get_image_scale(name) for name in image_names]
      columns = {}
      scales = []
      for i in range(5):
          columns[i] = []
          scales.append(0)
  
      for i, name in enumerate(image_names):
          which_col = scales.index(min(scales))
          image_scale = image_scales[i]
  
          columns[which_col].append(name)
          scales[which_col] += image_scale
  
      results = []
      for i in range(5):
          results += columns[i]
  
      return results
  