180 lines
4.9 KiB
Python
180 lines
4.9 KiB
Python
#!/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())
|