From 61bf3ada315591207fade42888a3e1060703ccbf Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Fri, 20 May 2016 12:00:05 +0200 Subject: [PATCH] convert src images to RGBA if band merge requires alpha band --- mapproxy/image/merge.py | 16 ++++++++++++++-- mapproxy/test/unit/test_image.py | 24 +++++++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/mapproxy/image/merge.py b/mapproxy/image/merge.py index 82751c6be..7b40a2cd6 100644 --- a/mapproxy/image/merge.py +++ b/mapproxy/image/merge.py @@ -148,6 +148,7 @@ def __init__(self, mode=None): self.ops = [] self.cacheable = True self.mode = mode + self.max_band = {} def add_ops(self, dst_band, src_img, src_band, factor=1.0): self.ops.append(band_ops( @@ -156,6 +157,8 @@ def add_ops(self, dst_band, src_img, src_band, factor=1.0): src_band=src_band, factor=factor, )) + # store highest requested band index for each source + self.max_band[src_img] = max(self.max_band.get(src_img, 0), src_band) def merge(self, sources, image_opts, size=None, bbox=None, bbox_srs=None, coverage=None): if not sources: @@ -166,10 +169,19 @@ def merge(self, sources, image_opts, size=None, bbox=None, bbox_srs=None, covera # load src bands src_img_bands = [] - for layer_img in sources: + for i, layer_img in enumerate(sources): img = layer_img.as_image() - if img.mode == 'P': + + if i not in self.max_band: + # do not split img if not requested by any op + src_img_bands.append(None) + continue + + if self.max_band[i] == 3 and img.mode != 'RGBA': + # convert to RGBA if band idx 3 is requestd (e.g. P or RGB src) img = img.convert('RGBA') + elif img.mode == 'P': + img = img.convert('RGB') src_img_bands.append(img.split()) tmp_mode = self.mode diff --git a/mapproxy/test/unit/test_image.py b/mapproxy/test/unit/test_image.py index 001ae3dcf..8435834e2 100644 --- a/mapproxy/test/unit/test_image.py +++ b/mapproxy/test/unit/test_image.py @@ -733,4 +733,26 @@ def test_from_p_merge(self): img = result.as_image() eq_(img.mode, 'RGB') - eq_(img.getpixel((0, 0)), (200, 100, 0)) \ No newline at end of file + eq_(img.getpixel((0, 0)), (200, 100, 0)) + + def test_from_mixed_merge(self): + """ + Check merge RGBA bands from image without alpha (mixed) + """ + merger = BandMerger(mode='RGBA') + + merger.add_ops(dst_band=0, src_img=0, src_band=2) + merger.add_ops(dst_band=1, src_img=0, src_band=1) + merger.add_ops(dst_band=2, src_img=0, src_band=0) + merger.add_ops(dst_band=3, src_img=0, src_band=3) + + img = Image.new('RGB', (10, 10), (0, 100, 200)) + src_img = ImageSource(img) + + img_opts = ImageOptions('RGBA') + result = merger.merge([src_img], img_opts) + + img = result.as_image() + eq_(img.mode, 'RGBA') + eq_(img.getpixel((0, 0)), (200, 100, 0, 255)) +