Source code for psd_tools.psd.header
"""
File header structure.
"""
import logging
from typing import Any, BinaryIO, TypeVar
from attrs import define, field, astuple
from psd_tools.constants import ColorMode
from psd_tools.psd.base import BaseElement
from psd_tools.psd.bin_utils import read_fmt, write_fmt
from psd_tools.validators import in_, range_
logger = logging.getLogger(__name__)
T = TypeVar("T", bound="FileHeader")
[docs]
@define(repr=True)
class FileHeader(BaseElement):
"""
Header section of the PSD file.
Example::
from psd_tools.psd.header import FileHeader
from psd_tools.constants import ColorMode
header = FileHeader(channels=2, height=359, width=400, depth=8,
color_mode=ColorMode.GRAYSCALE)
.. py:attribute:: signature
Signature: always equal to ``b'8BPS'``.
.. py:attribute:: version
Version number. PSD is 1, and PSB is 2.
.. py:attribute:: channels
The number of channels in the image, including any user-defined alpha
channel.
.. py:attribute:: height
The height of the image in pixels.
.. py:attribute:: width
The width of the image in pixels.
.. py:attribute:: depth
The number of bits per channel.
.. py:attribute:: color_mode
The color mode of the file. See
:py:class:`~psd_tools.constants.ColorMode`
"""
_FORMAT = "4sH6xHIIHH"
signature: bytes = field(default=b"8BPS", repr=False)
version: int = field(default=1, validator=in_((1, 2)))
channels: int = field(default=4, validator=range_(1, 57))
height: int = field(default=64, validator=range_(1, 300001))
width: int = field(default=64, validator=range_(1, 300001))
depth: int = field(default=8, validator=in_((1, 8, 16, 32)))
color_mode: ColorMode = field(
default=ColorMode.RGB, converter=ColorMode, validator=in_(ColorMode)
)
@signature.validator
def _validate_signature(self, attribute: Any, value: bytes) -> None:
if value != b"8BPS":
raise ValueError("This is not a PSD or PSB file")
@classmethod
def read(cls: type[T], fp: BinaryIO, **kwargs: Any) -> T:
return cls(*read_fmt(cls._FORMAT, fp))
def write(self, fp: BinaryIO, **kwargs: Any) -> int:
return write_fmt(fp, self._FORMAT, *astuple(self))