def test_composite_minimal(filename): source = PSDImage.open(full_name('layers-minimal/' + filename)) reference = PSDImage.open(full_name('layers/' + filename)).numpy() color, _, alpha = composite(source, force=True) result = color if reference.shape[2] > color.shape[2]: result = np.concatenate((color, alpha), axis=2) assert _mse(reference, result) <= 0.017
def test_pilio(fixture): image = fixture.topil() for i in range(fixture.channels): fixture.topil(channel=i) psd = PSDImage.frompil(image, compression=Compression.RAW) assert psd._record.header == fixture._record.header assert psd._record.image_data == fixture._record.image_data
def test_composite_artboard(): psd = PSDImage.open(full_name('artboard.psd')) document_image = psd.numpy() assert document_image.shape[:2] == (psd.height, psd.width) artboard = psd[0] artboard_image = composite(artboard)[0] assert artboard_image.shape[:2] == (artboard.height, artboard.width)
def test_composite_layer_filter(): psd = PSDImage.open(full_name('colormodes/4x4_8bit_rgba.psd')) # Check layer_filter. rendered = psd.composite(layer_filter=lambda x: False) reference = psd.topil() assert all(a != b for a, b in zip(rendered.getextrema(), reference.getextrema()))
def test_compose_bbox(): psd = PSDImage.open(full_name('layers/smartobject-layer.psd')) bbox = (1, 1, 31, 31) size = (bbox[2] - bbox[0], bbox[3] - bbox[1]) assert psd.compose().size == psd.size assert psd.compose(bbox=bbox).size == size assert psd[0].compose().size == psd[0].size assert psd[0].compose(bbox=bbox).size == size
def test_compose_artboard(): psd = PSDImage.open(full_name('artboard.psd')) document_image = psd.compose() assert document_image.size == psd.size artboard = psd[0] artboard_image = artboard.compose() assert artboard_image.size == artboard.size assert artboard.size != Group.extract_bbox(artboard)
def test_apply_mask(): from PIL import Image psd = PSDImage.open(full_name('masks/2.psd')) reference = np.asarray(Image.open(full_name('masks/2.png'))) / 255. result = np.concatenate(composite(psd)[::2], axis=2) assert reference.shape == result.shape # Hidden color seems different. assert _mse(reference[:, :, -1], result[:, :, -1]) <= 0.01
def test_composite_pil(colormode, depth, mode, ignore_preview): from PIL import Image filename = 'colormodes/4x4_%gbit_%s.psd' % (depth, colormode) psd = PSDImage.open(full_name(filename)) image = psd.composite(ignore_preview=ignore_preview) assert isinstance(image, Image.Image) assert image.mode == mode for layer in psd: assert isinstance(layer.composite(), Image.Image)
def test_composite_viewport(): psd = PSDImage.open(full_name('layers/smartobject-layer.psd')) bbox = (1, 1, 31, 31) shape = (bbox[3] - bbox[1], bbox[2] - bbox[0], 1) assert composite(psd)[1].shape == (psd.height, psd.width, 1) assert composite(psd, viewport=bbox)[1].shape == shape assert composite(psd[0])[1].shape == (psd[0].height, psd[0].width, 1) assert composite(psd[0], viewport=bbox)[1].shape == shape
def test_apply_mask(): psd = PSDImage.open(full_name('masks/2.psd')) image = Image.open(full_name('masks/2.png')) rendered = psd.compose() assert image.size == rendered.size assert _calculate_hash_error(image, rendered) <= 0.1 for i, layer in enumerate(psd): image = Image.open(full_name('masks/2-ellipse{}.png'.format(i + 1))) image = image rendered = layer.compose() assert image.size == rendered.size assert _calculate_hash_error(image, rendered) <= 0.1
def adjustment_layer(): return PSDImage.open(full_name('layers/brightness-contrast.psd'))[0]
def test_clip_adjustment(): psd = PSDImage.open(full_name('clip-adjustment.psd')) assert len(psd) == 1 layer = psd[0] assert layer.kind == 'type' assert len(layer.clip_layers) == 1
def test_group_extract_bbox(): psd = PSDImage.open(full_name('hidden-groups.psd')) assert Group.extract_bbox(psd[1:], False) == (40, 72, 83, 134) assert Group.extract_bbox(psd[1:], True) == (25, 34, 83, 134)
def layer_mask_data(): return PSDImage.open(full_name('layer_mask_data.psd'))
def pixel_layer(): return PSDImage.open(full_name('layers/pixel-layer.psd'))[0]
def test_composite_colormodes(colormode, depth): filename = 'colormodes/4x4_%gbit_%s.psd' % (depth, colormode) psd = PSDImage.open(full_name(filename)) composite_error(psd, 0.01, False, 'color')
def test_apply_icc_profile(): filepath = full_name('colorprofiles/north_america_newspaper.psd') psd = PSDImage.open(filepath) no_icc = psd.compose(apply_icc=False) with_icc = psd.compose(apply_icc=True) assert no_icc.getextrema() != with_icc.getextrema()
def test_compose_minimal(filename): source = PSDImage.open(full_name('layers-minimal/' + filename)).compose() reference = PSDImage.open(full_name('layers/' + filename)).compose(True) assert _calculate_hash_error(source, reference) <= 0.172
def test_compose_colormodes(colormode, depth): filename = 'colormodes/4x4_%gbit_%s.psd' % (depth, colormode) psd = PSDImage.open(full_name(filename)) assert isinstance(psd.compose(), Image.Image)
def test_composite_layer_filter(): psd = PSDImage.open(full_name('clipping-mask.psd')) reference = composite(psd) result = composite(psd, layer_filter=lambda x: x.name != 'Shape 3') assert _mse(reference[0], result[0]) > 0
def test_compose_quality(filename, threshold=0.1): psd = PSDImage.open(full_name(filename)) preview = psd.topil() rendered = psd.compose(force=True) assert _calculate_hash_error(preview, rendered) <= threshold
def type_layer(): return PSDImage.open(full_name('layers/type-layer.psd'))[0]
def test_composite_stroke(): psd = PSDImage.open(full_name('stroke.psd')) reference = composite(psd, force=True) result = composite(psd) assert _mse(reference[0], result[0]) > 0
from __future__ import absolute_import, unicode_literals import pytest import logging from psd_tools.api.psd_image import PSDImage from psd_tools.terminology import Enum from ..utils import full_name logger = logging.getLogger(__name__) LAYER_EFFECTS = PSDImage.open(full_name('layer_effects.psd')) @pytest.fixture def fixture(): yield LAYER_EFFECTS def test_effects(fixture): assert isinstance(fixture[0].effects.scale, float) assert fixture[0].effects.enabled is True for layer in fixture: assert layer.__repr__() for effect in fixture[0].effects: assert effect.enabled is True def test_bevel(fixture): effect = fixture[1].effects[0] assert not hasattr(effect, 'blend_mode')
def fill_layer(): return PSDImage.open(full_name('layers/solid-color-fill.psd'))[0]
def test_apply_opacity(): psd = PSDImage.open(full_name('opacity-fill.psd')) result = composite(psd) assert _mse(psd.numpy('shape'), result[2]) < 0.01
def smartobject_layer(): return PSDImage.open(full_name('layers/smartobject-layer.psd'))[0]
def check_composite_quality(filename, threshold=0.1, force=False): psd = PSDImage.open(full_name(filename)) composite_error(psd, threshold, force)
def group(): return PSDImage.open(full_name('layers/group.psd'))[0]
def test_apply_opacity(): psd = PSDImage.open(full_name('opacity-fill.psd')) image = psd.compose(force=True) assert image.getpixel((0, 0))[-1] == psd.compose().getpixel((0, 0))[-1]