272 строки
8.0 KiB
Python
Исполняемый файл
272 строки
8.0 KiB
Python
Исполняемый файл
#!/usr/bin/env pytest
|
|
###############################################################################
|
|
# $Id$
|
|
#
|
|
# Project: GDAL/OGR Test Suite
|
|
# Purpose: rgb2pct.py and pct2rgb.py testing
|
|
# Author: Even Rouault <even dot rouault @ spatialys.com>
|
|
#
|
|
###############################################################################
|
|
# Copyright (c) 2010, Even Rouault <even dot rouault at spatialys.com>
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
# copy of this software and associated documentation files (the "Software"),
|
|
# to deal in the Software without restriction, including without limitation
|
|
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
# and/or sell copies of the Software, and to permit persons to whom the
|
|
# Software is furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included
|
|
# in all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
# DEALINGS IN THE SOFTWARE.
|
|
###############################################################################
|
|
|
|
|
|
import os
|
|
import struct
|
|
|
|
import gdaltest
|
|
import pytest
|
|
import test_py_scripts
|
|
|
|
import osgeo_utils.auxiliary.color_table as color_table
|
|
from osgeo import gdal
|
|
from osgeo_utils import gdalattachpct, rgb2pct
|
|
|
|
pytestmark = pytest.mark.skipif(
|
|
test_py_scripts.get_py_script("rgb2pct") is None,
|
|
reason="rgb2pct.py not available",
|
|
)
|
|
|
|
|
|
@pytest.fixture()
|
|
def script_path():
|
|
return test_py_scripts.get_py_script("rgb2pct")
|
|
|
|
|
|
###############################################################################
|
|
# Test rgb2pct
|
|
|
|
|
|
def test_rgb2pct_1(script_path):
|
|
|
|
test_py_scripts.run_py_script(
|
|
script_path,
|
|
"rgb2pct",
|
|
test_py_scripts.get_data_path("gcore") + "rgbsmall.tif tmp/test_rgb2pct_1.tif",
|
|
)
|
|
|
|
ds = gdal.Open("tmp/test_rgb2pct_1.tif")
|
|
assert ds.GetRasterBand(1).Checksum() == 31231
|
|
ds = None
|
|
|
|
|
|
###############################################################################
|
|
# Test pct2rgb
|
|
|
|
|
|
def test_pct2rgb_1(script_path):
|
|
gdal_array = pytest.importorskip("osgeo.gdal_array")
|
|
try:
|
|
gdal_array.BandRasterIONumPy
|
|
except AttributeError:
|
|
pytest.skip("osgeo.gdal_array.BandRasterIONumPy is unavailable")
|
|
|
|
test_py_scripts.run_py_script(
|
|
script_path, "pct2rgb", "tmp/test_rgb2pct_1.tif tmp/test_pct2rgb_1.tif"
|
|
)
|
|
|
|
ds = gdal.Open("tmp/test_pct2rgb_1.tif")
|
|
assert ds.GetRasterBand(1).Checksum() == 20963
|
|
|
|
ori_ds = gdal.Open(test_py_scripts.get_data_path("gcore") + "rgbsmall.tif")
|
|
max_diff = gdaltest.compare_ds(ori_ds, ds)
|
|
assert max_diff <= 18
|
|
|
|
ds = None
|
|
ori_ds = None
|
|
|
|
|
|
###############################################################################
|
|
# Test rgb2pct -n option
|
|
|
|
|
|
def test_rgb2pct_2(script_path):
|
|
|
|
test_py_scripts.run_py_script(
|
|
script_path,
|
|
"rgb2pct",
|
|
"-n 16 "
|
|
+ test_py_scripts.get_data_path("gcore")
|
|
+ "rgbsmall.tif tmp/test_rgb2pct_2.tif",
|
|
)
|
|
|
|
ds = gdal.Open("tmp/test_rgb2pct_2.tif")
|
|
assert ds.GetRasterBand(1).Checksum() == 16596
|
|
|
|
ct = ds.GetRasterBand(1).GetRasterColorTable()
|
|
for i in range(16, 255):
|
|
entry = ct.GetColorEntry(i)
|
|
assert (
|
|
entry[0] == 0 and entry[1] == 0 and entry[2] == 0
|
|
), "Color table has more than 16 entries"
|
|
|
|
ds = None
|
|
|
|
|
|
###############################################################################
|
|
# Test rgb2pct -pct option
|
|
|
|
|
|
def test_rgb2pct_3(script_path):
|
|
|
|
test_py_scripts.run_py_script(
|
|
script_path,
|
|
"rgb2pct",
|
|
"-pct tmp/test_rgb2pct_2.tif "
|
|
+ test_py_scripts.get_data_path("gcore")
|
|
+ "rgbsmall.tif tmp/test_rgb2pct_3.tif",
|
|
)
|
|
|
|
ds = gdal.Open("tmp/test_rgb2pct_3.tif")
|
|
assert ds.GetRasterBand(1).Checksum() == 16596
|
|
|
|
ct = ds.GetRasterBand(1).GetRasterColorTable()
|
|
for i in range(16, 255):
|
|
entry = ct.GetColorEntry(i)
|
|
assert (
|
|
entry[0] == 0 and entry[1] == 0 and entry[2] == 0
|
|
), "Color table has more than 16 entries"
|
|
|
|
ds = None
|
|
|
|
|
|
###############################################################################
|
|
# Test pct2rgb with big CT (>256 entries)
|
|
|
|
|
|
def test_pct2rgb_4(script_path):
|
|
gdal_array = pytest.importorskip("osgeo.gdal_array")
|
|
try:
|
|
gdal_array.BandRasterIONumPy
|
|
except AttributeError:
|
|
pytest.skip("osgeo.gdal_array.BandRasterIONumPy is unavailable")
|
|
|
|
test_py_scripts.run_py_script(
|
|
script_path,
|
|
"pct2rgb",
|
|
"-rgba "
|
|
+ test_py_scripts.get_data_path("gcore")
|
|
+ "rat.img tmp/test_pct2rgb_4.tif",
|
|
)
|
|
|
|
ds = gdal.Open("tmp/test_pct2rgb_4.tif")
|
|
ori_ds = gdal.Open(test_py_scripts.get_data_path("gcore") + "rat.img")
|
|
|
|
ori_data = struct.unpack(
|
|
"H", ori_ds.GetRasterBand(1).ReadRaster(1990, 1990, 1, 1, 1, 1)
|
|
)[0]
|
|
data = (
|
|
struct.unpack("B", ds.GetRasterBand(1).ReadRaster(1990, 1990, 1, 1, 1, 1))[0],
|
|
struct.unpack("B", ds.GetRasterBand(2).ReadRaster(1990, 1990, 1, 1, 1, 1))[0],
|
|
struct.unpack("B", ds.GetRasterBand(3).ReadRaster(1990, 1990, 1, 1, 1, 1))[0],
|
|
struct.unpack("B", ds.GetRasterBand(4).ReadRaster(1990, 1990, 1, 1, 1, 1))[0],
|
|
)
|
|
|
|
ct = ori_ds.GetRasterBand(1).GetRasterColorTable()
|
|
entry = ct.GetColorEntry(ori_data)
|
|
|
|
assert entry == data
|
|
|
|
ds = None
|
|
ori_ds = None
|
|
|
|
|
|
def test_gdalattachpct_1():
|
|
pct_filename = "tmp/test_rgb2pct_2.tif"
|
|
src_filename = test_py_scripts.get_data_path("gcore") + "rgbsmall.tif"
|
|
pct_filename4 = "tmp/test_gdalattachpct_1_4.txt"
|
|
|
|
# pct from raster
|
|
ct0 = color_table.get_color_table(pct_filename)
|
|
ds1, err = rgb2pct.doit(src_filename=src_filename, pct_filename=pct_filename)
|
|
ct1 = color_table.get_color_table(ds1)
|
|
assert (
|
|
err == 0
|
|
and ds1 is not None
|
|
and ct1 is not None
|
|
and color_table.are_equal_color_table(ct0, ct1)
|
|
)
|
|
ds1 = None
|
|
|
|
# generate some junk color table
|
|
color2 = (1, 2, 3, 4)
|
|
ct2a = color_table.get_fixed_color_table(color2)
|
|
assert color_table.is_fixed_color_table(ct2a, color2)
|
|
|
|
# assign junk color table
|
|
ds2, err = gdalattachpct.doit(src_filename=src_filename, pct_filename=ct2a)
|
|
ct2b = color_table.get_color_table(ds2)
|
|
assert (
|
|
err == 0 and ds2 is not None and color_table.are_equal_color_table(ct2a, ct2b)
|
|
)
|
|
ds2 = None
|
|
|
|
# pct from gdal.ColorTable object
|
|
ds3, err = gdalattachpct.doit(src_filename=src_filename, pct_filename=ct1)
|
|
ct3 = color_table.get_color_table(ds3)
|
|
assert err == 0 and ds3 is not None and color_table.are_equal_color_table(ct1, ct3)
|
|
ds3 = None
|
|
|
|
# write color table to a txt file
|
|
color_table.write_color_table_to_file(ct3, pct_filename4)
|
|
ct4 = color_table.get_color_table(pct_filename4)
|
|
assert color_table.are_equal_color_table(ct3, ct4)
|
|
|
|
# pct from txt file
|
|
ds5, err = rgb2pct.doit(src_filename=src_filename, pct_filename=ct4)
|
|
ct5 = color_table.get_color_table(ds5)
|
|
assert (
|
|
err == 0
|
|
and ds5 is not None
|
|
and ct5 is not None
|
|
and color_table.are_equal_color_table(ct4, ct5)
|
|
)
|
|
ds5 = None
|
|
|
|
ct1 = None
|
|
ct2b = None
|
|
ct2a = None
|
|
ct3 = None
|
|
ct4 = None
|
|
ct5 = None
|
|
|
|
|
|
###############################################################################
|
|
# Cleanup
|
|
|
|
|
|
def test_rgb2pct_cleanup():
|
|
|
|
lst = [
|
|
"tmp/test_rgb2pct_1.tif",
|
|
"tmp/test_pct2rgb_1.tif",
|
|
"tmp/test_rgb2pct_2.tif",
|
|
"tmp/test_rgb2pct_3.tif",
|
|
"tmp/test_pct2rgb_1.tif",
|
|
"tmp/test_pct2rgb_4.tif",
|
|
"tmp/test_gdalattachpct_1_4.txt",
|
|
]
|
|
for filename in lst:
|
|
try:
|
|
os.remove(filename)
|
|
except OSError:
|
|
pass
|