# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals, print_function import warnings import io from psd_tools.constants import TaggedBlock, SectionDivider, BlendMode, SectionDividerSub from psd_tools.decoder.actions import decode_descriptor, UnknownOSType from psd_tools.decoder.color import decode_color from psd_tools.utils import read_fmt, unpack from psd_tools.decoder import decoders, layer_effects, linked_layer from psd_tools.reader.layers import Block from psd_tools.debug import pretty_namedtuple from psd_tools.exceptions import Error _tagged_block_decoders, register = decoders.new_registry() _tagged_block_decoders.update( { TaggedBlock.BLEND_CLIPPING_ELEMENTS: decoders.boolean, TaggedBlock.BLEND_INTERIOR_ELEMENTS: decoders.boolean, TaggedBlock.KNOCKOUT_SETTING: decoders.boolean, TaggedBlock.UNICODE_LAYER_NAME: decoders.unicode_string, TaggedBlock.LAYER_ID: decoders.single_value("I"), TaggedBlock.FILL_OPACITY: decoders.single_value("B"), TaggedBlock.EFFECTS_LAYER: layer_effects.decode, TaggedBlock.OBJECT_BASED_EFFECTS_LAYER_INFO: layer_effects.decode_object_based, TaggedBlock.LINKED_LAYER1: linked_layer.decode, TaggedBlock.LINKED_LAYER2: linked_layer.decode, TaggedBlock.LINKED_LAYER3: linked_layer.decode, } )
# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals, division import io import warnings import collections from psd_tools.utils import (read_pascal_string, unpack, read_fmt, read_unicode_string, be_array_from_bytes, decode_fixed_point_32bit) from psd_tools.constants import ImageResourceID, PrintScaleStyle, DisplayResolutionUnit, DimensionUnit from psd_tools.decoder import decoders from psd_tools.decoder.actions import decode_descriptor, UnknownOSType from psd_tools.decoder.color import decode_color _image_resource_decoders, register = decoders.new_registry() _image_resource_decoders.update({ ImageResourceID.LAYER_STATE_INFO: decoders.single_value("H"), ImageResourceID.WATERMARK: decoders.single_value("B"), ImageResourceID.ICC_UNTAGGED_PROFILE: decoders.boolean(), ImageResourceID.EFFECTS_VISIBLE: decoders.boolean(), ImageResourceID.IDS_SEED_NUMBER: decoders.single_value("I"), ImageResourceID.INDEXED_COLOR_TABLE_COUNT: decoders.single_value("H"), ImageResourceID.TRANSPARENCY_INDEX: decoders.single_value("H"),
# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals, division import io import warnings import collections from psd_tools.utils import (read_pascal_string, unpack, read_fmt, read_unicode_string, be_array_from_bytes, decode_fixed_point_32bit) from psd_tools.constants import ImageResourceID, PrintScaleStyle, DisplayResolutionUnit, DimensionUnit from psd_tools.decoder import decoders from psd_tools.decoder.actions import decode_descriptor, UnknownOSType _image_resource_decoders, register = decoders.new_registry() _image_resource_decoders.update({ ImageResourceID.LAYER_STATE_INFO: decoders.single_value("H"), ImageResourceID.WATERMARK: decoders.single_value("B"), ImageResourceID.ICC_UNTAGGED_PROFILE: decoders.boolean(), ImageResourceID.EFFECTS_VISIBLE: decoders.boolean(), ImageResourceID.IDS_SEED_NUMBER: decoders.single_value("I"), ImageResourceID.INDEXED_COLOR_TABLE_COUNT: decoders.single_value("H"), ImageResourceID.TRANSPARENCY_INDEX: decoders.single_value("H"), ImageResourceID.GLOBAL_ALTITUDE: decoders.single_value("I"), ImageResourceID.GLOBAL_ANGLE_OBSOLETE: decoders.single_value("I"), ImageResourceID.COPYRIGHT_FLAG: decoders.boolean("H"), ImageResourceID.ALPHA_NAMES_UNICODE: decoders.unicode_string, ImageResourceID.WORKFLOW_URL: decoders.unicode_string, })
# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals, print_function import warnings import io from psd_tools.decoder import decoders from psd_tools.decoder.actions import decode_descriptor, UnknownOSType from psd_tools.decoder.color import decode_color from psd_tools.exceptions import Error from psd_tools.utils import read_fmt from psd_tools.constants import EffectOSType, BlendMode from psd_tools.debug import pretty_namedtuple _effect_info_decoders, register = decoders.new_registry() Effects = pretty_namedtuple('Effects', 'version effects_count effects_list') _LayerEffect = pretty_namedtuple('LayerEffect', 'effect_type effect_info') ObjectBasedEffects = pretty_namedtuple('ObjectBasedEffects', 'version descriptor_version descriptor') CommonStateInfo = pretty_namedtuple('CommonStateInfo', 'version visible unused') ShadowInfo = pretty_namedtuple('ShadowInfo', 'version enabled ' 'blend_mode color opacity ' 'angle use_global_angle ' 'distance intensity blur ' 'native_color') OuterGlowInfo = pretty_namedtuple('OuterGlowInfo', 'version enabled ' 'blend_mode opacity color ' 'intensity blur ' 'native_color') InnerGlowInfo = pretty_namedtuple('InnerGlowInfo', 'version enabled '
# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals, print_function import warnings import collections import io from psd_tools.decoder.parseEngineData import paresr from psd_tools.constants import TaggedBlock, SectionDivider, OSType from psd_tools.decoder.actions import decode_descriptor, UnknownOSType from psd_tools.utils import read_fmt, unpack from psd_tools.decoder import decoders, layer_effects from psd_tools.reader.layers import Block from psd_tools.debug import pretty_namedtuple _tagged_block_decoders, register = decoders.new_registry() _tagged_block_decoders.update({ TaggedBlock.BLEND_CLIPPING_ELEMENTS: decoders.boolean("I"), TaggedBlock.BLEND_INTERIOR_ELEMENTS: decoders.boolean("I"), TaggedBlock.KNOCKOUT_SETTING: decoders.boolean("I"), TaggedBlock.UNICODE_LAYER_NAME: decoders.unicode_string, TaggedBlock.LAYER_ID: decoders.single_value( "I" ), # XXX: there are more fields in docs, but they seem to be incorrect TaggedBlock.EFFECTS_LAYER: layer_effects.decode,
class EngineDataDecoder(object): """ Engine data decoder. """ _decoders, register = decoders.new_registry() def __init__(self, data, divider=b'[ \n\t]+'): self.node_stack = [{}] self.prop_stack = [b'Root'] self.data = data self.tokenizer = EngineTokenizer(divider=divider) def parse(self): for token in self.tokenizer.tokenize(self.data): value = self._parse_token(token) if value is not None: if isinstance(self.node_stack[-1], list): self.node_stack[-1].append(value) else: self.node_stack[-1][self.prop_stack[-1]] = value return self.node_stack[0].get(b'Root', self.node_stack[0]) def _parse_token(self, token): patterns = EngineToken._values_dict() for pattern in patterns: match = pattern.search(token) if match: return self._decoders[pattern](self, match) raise InvalidTokenError("Unknown token: {}".format(token)) @register(EngineToken.ARRAY_END) def _decode_array_end(self, match): return self.node_stack.pop() @register(EngineToken.ARRAY_START) def _decode_array_start(self, match): self.node_stack.append([]) @register(EngineToken.BOOLEAN) def _decode_boolean(self, match): return True if match.group(1) == b'true' else False @register(EngineToken.DICT_END) def _decode_dict_end(self, match): self.prop_stack.pop() return self.node_stack.pop() @register(EngineToken.DICT_START) def _decode_dict_start(self, match): self.prop_stack.append(None) self.node_stack.append({}) @register(EngineToken.NOOP) def _decode_noop(self, match): pass @register(EngineToken.NUMBER) def _decode_number(self, match): return int(match.group(1)) @register(EngineToken.NUMBER_WITH_DECIMAL) def _decode_number_with_decimal(self, match): return float(match.group(0)) @register(EngineToken.PROPERTY) def _decode_property(self, match): self.prop_stack[-1] = match.group(1) @register(EngineToken.STRING) def _decode_string(self, match): # UTF-16 is backslash-escaped here. return re.sub(b'\\\\(.)', b'\\1', match.group(1)).decode('utf-16', 'replace') @register(EngineToken.UNKNOWN_TAG) def _decode_unknown_tag(self, match): return match
from psd_tools.decoder.tagged_blocks import ( SolidColorSetting, PatternFillSetting, GradientFillSetting, VectorStrokeSetting, VectorMaskSetting, VectorStrokeContentSetting, ContentGeneratorExtraData, LevelsSettings, CurvesSettings, Exposure, Vibrance, HueSaturation, ColorBalance, BlackWhite, PhotoFilter, ChannelMixer, ColorLookup, Invert, Posterize, Threshold, SelectiveColor, GradientSettings, VectorOriginationData) from psd_tools.decoder.layer_effects import ObjectBasedEffects from psd_tools.user_api.effects import ( GradientOverlay, PatternOverlay, ColorOverlay) from psd_tools.user_api import adjustments, BBox from psd_tools.user_api.shape import StrokeStyle, VectorMask, Origination _translators, register = new_registry() _desc_translators, desc_register = new_registry() #: Point object, x and y attributes. Point = pretty_namedtuple('Point', 'x y') #: Shape object, contains list of points in curve. Shape = pretty_namedtuple('Shape', 'name curve') #: Pattern object. Pattern = pretty_namedtuple('Pattern', 'name id') _Gradient = pretty_namedtuple( 'Gradient', 'desc_name name type smoothness colors transform') #: StopColor in gradient.
from psd_tools.exceptions import Error from psd_tools.utils import read_fmt, read_unicode_string, read_pascal_string, read_be_array from psd_tools.constants import EffectOSType, BlendMode, Compression from psd_tools.debug import pretty_namedtuple from psd_tools.reader.layers import ChannelData from psd_tools.user_api.pil_support import get_icc_profile, _get_header_channel_ids, _channel_data_to_PIL #from sys import getsizeof #import packbits #from pymaging.image import LoadedImage #from pymaging.pixelarray import get_pixel_array #from pymaging.colors import RGB, RGBA #from user_api.pyimaging_support import _get_mode _effect_info_decoders, register = decoders.new_registry() Effects = pretty_namedtuple('Effects', 'version effects_count effects_list') _LayerEffect = pretty_namedtuple('LayerEffect', 'effect_type effect_info') ObjectBasedEffects = pretty_namedtuple( 'ObjectBasedEffects', 'version descriptor_version descriptor') CommonStateInfo = pretty_namedtuple('CommonStateInfo', 'version visible unused') ShadowInfo = pretty_namedtuple( 'ShadowInfo', 'version enabled ' 'blend_mode color opacity ' 'angle use_global_angle ' 'distance intensity blur ' 'native_color') OuterGlowInfo = pretty_namedtuple(