#!/usr/bin/env python3 # SPDX-License-Identifier: Apache-2.0 # ----------------------------------------------------------------------------- # Copyright 2019-2020 Arm Limited # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy # of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # ----------------------------------------------------------------------------- """ The ``astc_test_image_dl`` utility provides a means to programatically download test images that are available online, avoiding the need to duplicate them in the git repository. """ import os import sys import urllib.request from PIL import Image TEST_IMAGE_DIR = os.path.join("Test", "Images") def download(testSet, index, srcUrl, dstPath): """ Download a single image. Args: testSet (str): The test set name. index (int): The download index. srcUrl (str): The download URL. dstPath (str): The destination path. """ dirName = os.path.dirname(dstPath) if not os.path.exists(dirName): os.makedirs(dirName) # Skip downloads if the file already exists if not os.path.exists(dstPath): print("%s image %u: Downloading" % (testSet, index)) urllib.request.urlretrieve(srcUrl, dstPath) else: print("%s image %u: Skipping" % (testSet, index)) def make_landscape(imgPath): """ Make an image on disk landscape aspect (edit in place) Args: imgPath: The pth of the image on disk. """ img = Image.open(imgPath) if img.size[0] < img.size[1]: img = img.rotate(90, expand=True) img.save(imgPath) def make_mixed_image(imgPathA, imgPathB, dstPath): """ Make image consisting of RGB from A's RGB, and alpha from B's luminance. Args: imgPathA: The path of input A on disk. imgPathB: The path of input B on disk. dstPath: The path of the destination. """ imgA = Image.open(imgPathA) imgB = Image.open(imgPathB).convert("L") imgA.putalpha(imgB) dirs = os.path.dirname(dstPath) if not os.path.exists(dirs): os.makedirs(dirs) imgA.save(dstPath) def make_montage(imageDir, dstPath): """ Make a single mosaic montage consisting of all of the Kodak images. Args: imgDir: The directory path of the Kodak images on disk. dstPth: The file path of the resulting montage. """ cols = 6 rows = 4 width = 768 height = 512 images = os.listdir(imageDir) images.sort() montage = Image.new('RGB', (width * cols, height * rows)) for i, src in enumerate(images): im = Image.open(os.path.join(imageDir, src)) col = i % cols row = i // cols montage.paste(im, (width * col, height * row)) dirs = os.path.dirname(dstPath) if not os.path.exists(dirs): os.makedirs(dirs) montage.save(dstPath) def retrieve_kodak_set(): """ Download the public domain Kodak image set. To make test set mosaics easier to build we rotate images to make everything landscape. """ testSet = "Kodak" # Download the original RGB images for i in range(1, 25): fle = "ldr-rgb-kodak%02u.png" % i dst = os.path.join(TEST_IMAGE_DIR, "Kodak", "LDR-RGB", fle) src = "http://r0k.us/graphics/kodak/kodak/kodim%02u.png" % i download(testSet, i, src, dst) # Canonicalize image aspect make_landscape(dst) # Make some correlated alpha RGBA images fle = "ldr-rgb-kodak%02u.png" # Expand later pattern = os.path.join(TEST_IMAGE_DIR, "Kodak", "LDR-RGB", fle) for i in (22, 23): imgA = pattern % i fle = "ldr-rgba-kodak%02u+ca.png" % i dst = os.path.join(TEST_IMAGE_DIR, "KodakSim", "LDR-RGBA", fle) make_mixed_image(imgA, imgA, dst) # Make some non-correlated alpha RGBA images for i, j in ((22, 24), (23, 20)): imgA = pattern % i imgB = pattern % j fle = "ldr-rgba-kodak%02u+%02u+nca.png" % (i, j) dst = os.path.join(TEST_IMAGE_DIR, "KodakSim", "LDR-RGBA", fle) make_mixed_image(imgA, imgB, dst) # Make a large montage srcDir = os.path.join(TEST_IMAGE_DIR, "Kodak", "LDR-RGB") fle = "ldr-rgb-montage.png" dst = os.path.join(TEST_IMAGE_DIR, "KodakMnt", "LDR-RGB", fle) make_montage(srcDir, dst) def main(): """ The main function. Returns: int: The process return code. """ retrieve_kodak_set() return 0 if __name__ == "__main__": sys.exit(main())