Class: PSD

Inherits:
Object
  • Object
show all
Includes:
Helpers, NodeExporting
Defined in:
lib/psd.rb,
lib/psd/file.rb,
lib/psd/mask.rb,
lib/psd/node.rb,
lib/psd/util.rb,
lib/psd/color.rb,
lib/psd/image.rb,
lib/psd/layer.rb,
lib/psd/header.rb,
lib/psd/helpers.rb,
lib/psd/section.rb,
lib/psd/version.rb,
lib/psd/resource.rb,
lib/psd/resources.rb,
lib/psd/blend_mode.rb,
lib/psd/descriptor.rb,
lib/psd/layer_info.rb,
lib/psd/layer_mask.rb,
lib/psd/path_record.rb,
lib/psd/nodes/search.rb,
lib/psd/channel_image.rb,
lib/psd/node_exporting.rb,
lib/psd/nodes/ancestry.rb,
lib/psd/nodes/has_children.rb,
lib/psd/layer_info/layer_id.rb,
lib/psd/layer_info/typetool.rb,
lib/psd/layer_info/vector_mask.rb,
lib/psd/layer_info/fill_opacity.rb,
lib/psd/layer_info/placed_layer.rb,
lib/psd/layer_info/unicode_name.rb,
lib/psd/layer_info/object_effects.rb,
lib/psd/layer_info/legacy_typetool.rb,
lib/psd/layer_info/reference_point.rb,
lib/psd/layer_info/layer_name_source.rb,
lib/psd/layer_info/layer_section_divider.rb

Overview

Internal structure to help us build trees of a Photoshop documents. A lot of method names borrowed from the Ruby ancestry gem.

Defined Under Namespace

Modules: HasChildren, Helpers, NodeExporting, Section Classes: BlendMode, ChannelImage, Color, Descriptor, File, FillOpacity, Header, Image, Layer, LayerID, LayerInfo, LayerMask, LayerNameSource, LayerSectionDivider, LegacyTypeTool, Mask, Node, ObjectEffects, PathRecord, PlacedLayer, ReferencePoint, Resource, Resources, TypeTool, UnicodeName, Util, VectorMask

Constant Summary collapse

DEFAULTS =
{
  parse_image: false,
  parse_layer_images: false
}
VERSION =
"0.3.3"
@@keys =
[]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from NodeExporting

#export_node, #hide_all_nodes

Methods included from Helpers

#actual_layers, #folders, #height, #layers, #tree, #width

Constructor Details

#initialize(file, opts = {}) ⇒ PSD

Create and store a reference to our PSD file



37
38
39
40
41
42
43
44
45
46
# File 'lib/psd.rb', line 37

def initialize(file, opts={})
  @file = PSD::File.new(file, 'rb')
  @file.seek 0 # If the file was previously used and not closed

  @opts = DEFAULTS.merge(opts)
  @header = nil
  @resources = nil
  @layer_mask = nil
  @parsed = false
end

Instance Attribute Details

#fileObject (readonly)

Returns the value of attribute file.



34
35
36
# File 'lib/psd.rb', line 34

def file
  @file
end

Class Method Details

.keysObject

Just used to track what layer info keys we didn’t parse in this file for development purposes.



26
# File 'lib/psd.rb', line 26

def self.keys; @@keys; end

Instance Method Details

#export(file) ⇒ Object

Export the current file to a new PSD. This may or may not work.



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/psd.rb', line 103

def export(file)
  parse! unless parsed?

  # Create our file for writing
  outfile = File.open(file, 'w')

  # Reset the file pointer
  @file.seek 0
  @header.write outfile
  @file.seek @header.num_bytes, IO::SEEK_CUR

  # Nothing in the header or resources we want to bother with changing
  # right now. Write it straight to file.
  outfile.write @file.read(@resources.end_of_section - @file.tell)

  # Now, the changeable part. Layers and masks.
  layer_mask.export(outfile)

  # And the rest of the file (merged image data)
  outfile.write @file.read
  outfile.flush
end

#headerObject

Get the Header, parsing it if needed.



68
69
70
# File 'lib/psd.rb', line 68

def header
  @header ||= Header.read(@file)
end

#imageObject

Get the full size flattened preview Image.



94
95
96
97
98
99
100
# File 'lib/psd.rb', line 94

def image
  ensure_header
  ensure_resources
  ensure_layer_mask

  @image ||= Image.new(@file, @header).parse
end

#layer_maskObject

Get the LayerMask section. Ensures the header and resources have been parsed first since they are required.



86
87
88
89
90
91
# File 'lib/psd.rb', line 86

def layer_mask
  ensure_header
  ensure_resources

  @layer_mask ||= LayerMask.new(@file, @header).parse
end

#parse!Object

There is a specific order that must be followed when parsing the PSD. Sections can be skipped if needed. This method will parse all sections of the PSD.



51
52
53
54
55
56
57
58
59
60
# File 'lib/psd.rb', line 51

def parse!
  header
  resources
  layer_mask
  image if @opts[:parse_image]
  
  @parsed = true

  return true
end

#parsed?Boolean

Has our PSD been parsed yet?

Returns:

  • (Boolean)


63
64
65
# File 'lib/psd.rb', line 63

def parsed?
  @parsed
end

#resourcesObject

Get the Resources section, parsing if needed.



73
74
75
76
77
78
79
80
81
82
# File 'lib/psd.rb', line 73

def resources
  return @resources.data unless @resources.nil?

  ensure_header

  @resources = Resources.new(@file)
  @resources.parse

  return @resources.data
end