File: PhotoshopDirectory.java

package info (click to toggle)
libmetadata-extractor-java 2.11.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, trixie
  • size: 6,416 kB
  • sloc: java: 35,343; xml: 200; sh: 11; makefile: 2
file content (260 lines) | stat: -rw-r--r-- 16,892 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
 * Copyright 2002-2017 Drew Noakes
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 *
 * More information about this project is available at:
 *
 *    https://drewnoakes.com/code/exif/
 *    https://github.com/drewnoakes/metadata-extractor
 */

package com.drew.metadata.photoshop;

import com.drew.lang.annotations.NotNull;
import com.drew.lang.annotations.Nullable;
import com.drew.metadata.Directory;

import java.util.HashMap;

/**
 * Holds the metadata found in the APPD segment of a JPEG file saved by Photoshop.
 *
 * @author Drew Noakes https://drewnoakes.com
 * @author Yuri Binev
 * @author Payton Garland
 */
@SuppressWarnings("WeakerAccess")
public class PhotoshopDirectory extends Directory
{
    public static final int TAG_CHANNELS_ROWS_COLUMNS_DEPTH_MODE                  = 0x03E8;
    public static final int TAG_MAC_PRINT_INFO                                    = 0x03E9;
    public static final int TAG_XML                                               = 0x03EA;
    public static final int TAG_INDEXED_COLOR_TABLE                               = 0x03EB;
    public static final int TAG_RESOLUTION_INFO                                   = 0x03ED;
    public static final int TAG_ALPHA_CHANNELS                                    = 0x03EE;
    public static final int TAG_DISPLAY_INFO_OBSOLETE                             = 0x03EF;
    public static final int TAG_CAPTION                                           = 0x03F0;
    public static final int TAG_BORDER_INFORMATION                                = 0x03F1;
    public static final int TAG_BACKGROUND_COLOR                                  = 0x03F2;
    public static final int TAG_PRINT_FLAGS                                       = 0x03F3;
    public static final int TAG_GRAYSCALE_AND_MULTICHANNEL_HALFTONING_INFORMATION = 0x03F4;
    public static final int TAG_COLOR_HALFTONING_INFORMATION                      = 0x03F5;
    public static final int TAG_DUOTONE_HALFTONING_INFORMATION                    = 0x03F6;
    public static final int TAG_GRAYSCALE_AND_MULTICHANNEL_TRANSFER_FUNCTION      = 0x03F7;
    public static final int TAG_COLOR_TRANSFER_FUNCTIONS                          = 0x03F8;
    public static final int TAG_DUOTONE_TRANSFER_FUNCTIONS                        = 0x03F9;
    public static final int TAG_DUOTONE_IMAGE_INFORMATION                         = 0x03FA;
    public static final int TAG_EFFECTIVE_BLACK_AND_WHITE_VALUES                  = 0x03FB;
    // OBSOLETE                                                                     0x03FC
    public static final int TAG_EPS_OPTIONS                                       = 0x03FD;
    public static final int TAG_QUICK_MASK_INFORMATION                            = 0x03FE;
    // OBSOLETE                                                                     0x03FF
    public static final int TAG_LAYER_STATE_INFORMATION                           = 0x0400;
    // Working path (not saved)                                                     0x0401
    public static final int TAG_LAYERS_GROUP_INFORMATION                          = 0x0402;
    // OBSOLETE                                                                     0x0403
    public static final int TAG_IPTC                                              = 0x0404;
    public static final int TAG_IMAGE_MODE_FOR_RAW_FORMAT_FILES                   = 0x0405;
    public static final int TAG_JPEG_QUALITY                                      = 0x0406;
    public static final int TAG_GRID_AND_GUIDES_INFORMATION                       = 0x0408;
    public static final int TAG_THUMBNAIL_OLD                                     = 0x0409;
    public static final int TAG_COPYRIGHT                                         = 0x040A;
    public static final int TAG_URL                                               = 0x040B;
    public static final int TAG_THUMBNAIL                                         = 0x040C;
    public static final int TAG_GLOBAL_ANGLE                                      = 0x040D;
    // OBSOLETE                                                                     0x040E
    public static final int TAG_ICC_PROFILE_BYTES                                 = 0x040F;
    public static final int TAG_WATERMARK                                         = 0x0410;
    public static final int TAG_ICC_UNTAGGED_PROFILE                              = 0x0411;
    public static final int TAG_EFFECTS_VISIBLE                                   = 0x0412;
    public static final int TAG_SPOT_HALFTONE                                     = 0x0413;
    public static final int TAG_SEED_NUMBER                                       = 0x0414;
    public static final int TAG_UNICODE_ALPHA_NAMES                               = 0x0415;
    public static final int TAG_INDEXED_COLOR_TABLE_COUNT                         = 0x0416;
    public static final int TAG_TRANSPARENCY_INDEX                                = 0x0417;
    public static final int TAG_GLOBAL_ALTITUDE                                   = 0x0419;
    public static final int TAG_SLICES                                            = 0x041A;
    public static final int TAG_WORKFLOW_URL                                      = 0x041B;
    public static final int TAG_JUMP_TO_XPEP                                      = 0x041C;
    public static final int TAG_ALPHA_IDENTIFIERS                                 = 0x041D;
    public static final int TAG_URL_LIST                                          = 0x041E;
    public static final int TAG_VERSION                                           = 0x0421;
    public static final int TAG_EXIF_DATA_1                                       = 0x0422;
    public static final int TAG_EXIF_DATA_3                                       = 0x0423;
    public static final int TAG_XMP_DATA                                          = 0x0424;
    public static final int TAG_CAPTION_DIGEST                                    = 0x0425;
    public static final int TAG_PRINT_SCALE                                       = 0x0426;
    public static final int TAG_PIXEL_ASPECT_RATIO                                = 0x0428;
    public static final int TAG_LAYER_COMPS                                       = 0x0429;
    public static final int TAG_ALTERNATE_DUOTONE_COLORS                          = 0x042A;
    public static final int TAG_ALTERNATE_SPOT_COLORS                             = 0x042B;
    public static final int TAG_LAYER_SELECTION_IDS                               = 0x042D;
    public static final int TAG_HDR_TONING_INFO                                   = 0x042E;
    public static final int TAG_PRINT_INFO                                        = 0x042F;
    public static final int TAG_LAYER_GROUPS_ENABLED_ID                           = 0x0430;
    public static final int TAG_COLOR_SAMPLERS                                    = 0x0431;
    public static final int TAG_MEASUREMENT_SCALE                                 = 0x0432;
    public static final int TAG_TIMELINE_INFORMATION                              = 0x0433;
    public static final int TAG_SHEET_DISCLOSURE                                  = 0x0434;
    public static final int TAG_DISPLAY_INFO                                      = 0x0435;
    public static final int TAG_ONION_SKINS                                       = 0x0436;
    public static final int TAG_COUNT_INFORMATION                                 = 0x0438;
    public static final int TAG_PRINT_INFO_2                                      = 0x043A;
    public static final int TAG_PRINT_STYLE                                       = 0x043B;
    public static final int TAG_MAC_NSPRINTINFO                                   = 0x043C;
    public static final int TAG_WIN_DEVMODE                                       = 0x043D;
    public static final int TAG_AUTO_SAVE_FILE_PATH                               = 0x043E;
    public static final int TAG_AUTO_SAVE_FORMAT                                  = 0x043F;
    public static final int TAG_PATH_SELECTION_STATE                              = 0x0440;
    // PATH INFO                                                                    0x07D0 -> 0x0BB6
    public static final int TAG_CLIPPING_PATH_NAME                                = 0x0BB7;
    public static final int TAG_ORIGIN_PATH_INFO                                  = 0x0BB8;
    // PLUG IN RESOURCES                                                            0x0FA0 -> 0x1387
    public static final int TAG_IMAGE_READY_VARIABLES_XML                         = 0x1B58;
    public static final int TAG_IMAGE_READY_DATA_SETS                             = 0x1B59;
    public static final int TAG_IMAGE_READY_SELECTED_STATE                        = 0x1B5A;
    public static final int TAG_IMAGE_READY_7_ROLLOVER                            = 0x1B5B;
    public static final int TAG_IMAGE_READY_ROLLOVER                              = 0x1B5C;
    public static final int TAG_IMAGE_READY_SAVE_LAYER_SETTINGS                   = 0x1B5D;
    public static final int TAG_IMAGE_READY_VERSION                               = 0x1B5E;
    public static final int TAG_LIGHTROOM_WORKFLOW                                = 0x1F40;
    public static final int TAG_PRINT_FLAGS_INFO                                  = 0x2710;

    @NotNull
    protected static final HashMap<Integer, String> _tagNameMap = new HashMap<Integer, String>();

    static {
        _tagNameMap.put(TAG_CHANNELS_ROWS_COLUMNS_DEPTH_MODE, "Channels, Rows, Columns, Depth, Mode");
        _tagNameMap.put(TAG_MAC_PRINT_INFO, "Mac Print Info");
        _tagNameMap.put(TAG_XML, "XML Data");
        _tagNameMap.put(TAG_INDEXED_COLOR_TABLE, "Indexed Color Table");
        _tagNameMap.put(TAG_RESOLUTION_INFO, "Resolution Info");
        _tagNameMap.put(TAG_ALPHA_CHANNELS, "Alpha Channels");
        _tagNameMap.put(TAG_DISPLAY_INFO_OBSOLETE, "Display Info (Obsolete)");
        _tagNameMap.put(TAG_CAPTION, "Caption");
        _tagNameMap.put(TAG_BORDER_INFORMATION, "Border Information");
        _tagNameMap.put(TAG_BACKGROUND_COLOR, "Background Color");
        _tagNameMap.put(TAG_PRINT_FLAGS, "Print Flags");
        _tagNameMap.put(TAG_GRAYSCALE_AND_MULTICHANNEL_HALFTONING_INFORMATION, "Grayscale and Multichannel Halftoning Information");
        _tagNameMap.put(TAG_COLOR_HALFTONING_INFORMATION, "Color Halftoning Information");
        _tagNameMap.put(TAG_DUOTONE_HALFTONING_INFORMATION, "Duotone Halftoning Information");
        _tagNameMap.put(TAG_GRAYSCALE_AND_MULTICHANNEL_TRANSFER_FUNCTION, "Grayscale and Multichannel Transfer Function");
        _tagNameMap.put(TAG_COLOR_TRANSFER_FUNCTIONS, "Color Transfer Functions");
        _tagNameMap.put(TAG_DUOTONE_TRANSFER_FUNCTIONS, "Duotone Transfer Functions");
        _tagNameMap.put(TAG_DUOTONE_IMAGE_INFORMATION, "Duotone Image Information");
        _tagNameMap.put(TAG_EFFECTIVE_BLACK_AND_WHITE_VALUES, "Effective Black and White Values");
        _tagNameMap.put(TAG_EPS_OPTIONS, "EPS Options");
        _tagNameMap.put(TAG_QUICK_MASK_INFORMATION, "Quick Mask Information");
        _tagNameMap.put(TAG_LAYER_STATE_INFORMATION, "Layer State Information");
        _tagNameMap.put(TAG_LAYERS_GROUP_INFORMATION, "Layers Group Information");
        _tagNameMap.put(TAG_IPTC, "IPTC-NAA Record");
        _tagNameMap.put(TAG_IMAGE_MODE_FOR_RAW_FORMAT_FILES, "Image Mode for Raw Format Files");
        _tagNameMap.put(TAG_JPEG_QUALITY, "JPEG Quality");
        _tagNameMap.put(TAG_GRID_AND_GUIDES_INFORMATION, "Grid and Guides Information");
        _tagNameMap.put(TAG_THUMBNAIL_OLD, "Photoshop 4.0 Thumbnail");
        _tagNameMap.put(TAG_COPYRIGHT, "Copyright Flag");
        _tagNameMap.put(TAG_URL, "URL");
        _tagNameMap.put(TAG_THUMBNAIL, "Thumbnail Data");
        _tagNameMap.put(TAG_GLOBAL_ANGLE, "Global Angle");
        _tagNameMap.put(TAG_ICC_PROFILE_BYTES, "ICC Profile Bytes");
        _tagNameMap.put(TAG_WATERMARK, "Watermark");
        _tagNameMap.put(TAG_ICC_UNTAGGED_PROFILE, "ICC Untagged Profile");
        _tagNameMap.put(TAG_EFFECTS_VISIBLE, "Effects Visible");
        _tagNameMap.put(TAG_SPOT_HALFTONE, "Spot Halftone");
        _tagNameMap.put(TAG_SEED_NUMBER, "Seed Number");
        _tagNameMap.put(TAG_UNICODE_ALPHA_NAMES, "Unicode Alpha Names");
        _tagNameMap.put(TAG_INDEXED_COLOR_TABLE_COUNT, "Indexed Color Table Count");
        _tagNameMap.put(TAG_TRANSPARENCY_INDEX, "Transparency Index");
        _tagNameMap.put(TAG_GLOBAL_ALTITUDE, "Global Altitude");
        _tagNameMap.put(TAG_SLICES, "Slices");
        _tagNameMap.put(TAG_WORKFLOW_URL, "Workflow URL");
        _tagNameMap.put(TAG_JUMP_TO_XPEP, "Jump To XPEP");
        _tagNameMap.put(TAG_ALPHA_IDENTIFIERS, "Alpha Identifiers");
        _tagNameMap.put(TAG_URL_LIST, "URL List");
        _tagNameMap.put(TAG_VERSION, "Version Info");
        _tagNameMap.put(TAG_EXIF_DATA_1, "EXIF Data 1");
        _tagNameMap.put(TAG_EXIF_DATA_3, "EXIF Data 3");
        _tagNameMap.put(TAG_XMP_DATA, "XMP Data");
        _tagNameMap.put(TAG_CAPTION_DIGEST, "Caption Digest");
        _tagNameMap.put(TAG_PRINT_SCALE, "Print Scale");
        _tagNameMap.put(TAG_PIXEL_ASPECT_RATIO, "Pixel Aspect Ratio");
        _tagNameMap.put(TAG_LAYER_COMPS, "Layer Comps");
        _tagNameMap.put(TAG_ALTERNATE_DUOTONE_COLORS, "Alternate Duotone Colors");
        _tagNameMap.put(TAG_ALTERNATE_SPOT_COLORS, "Alternate Spot Colors");
        _tagNameMap.put(TAG_LAYER_SELECTION_IDS, "Layer Selection IDs");
        _tagNameMap.put(TAG_HDR_TONING_INFO, "HDR Toning Info");
        _tagNameMap.put(TAG_PRINT_INFO, "Print Info");
        _tagNameMap.put(TAG_LAYER_GROUPS_ENABLED_ID, "Layer Groups Enabled ID");
        _tagNameMap.put(TAG_COLOR_SAMPLERS, "Color Samplers");
        _tagNameMap.put(TAG_MEASUREMENT_SCALE, "Measurement Scale");
        _tagNameMap.put(TAG_TIMELINE_INFORMATION, "Timeline Information");
        _tagNameMap.put(TAG_SHEET_DISCLOSURE, "Sheet Disclosure");
        _tagNameMap.put(TAG_DISPLAY_INFO, "Display Info");
        _tagNameMap.put(TAG_ONION_SKINS, "Onion Skins");
        _tagNameMap.put(TAG_COUNT_INFORMATION, "Count information");
        _tagNameMap.put(TAG_PRINT_INFO_2, "Print Info 2");
        _tagNameMap.put(TAG_PRINT_STYLE, "Print Style");
        _tagNameMap.put(TAG_MAC_NSPRINTINFO, "Mac NSPrintInfo");
        _tagNameMap.put(TAG_WIN_DEVMODE, "Win DEVMODE");
        _tagNameMap.put(TAG_AUTO_SAVE_FILE_PATH, "Auto Save File Subpath");
        _tagNameMap.put(TAG_AUTO_SAVE_FORMAT, "Auto Save Format");
        _tagNameMap.put(TAG_PATH_SELECTION_STATE, "Subpath Selection State");

        _tagNameMap.put(TAG_CLIPPING_PATH_NAME, "Clipping Path Name");
        _tagNameMap.put(TAG_ORIGIN_PATH_INFO, "Origin Subpath Info");
        _tagNameMap.put(TAG_IMAGE_READY_VARIABLES_XML, "Image Ready Variables XML");
        _tagNameMap.put(TAG_IMAGE_READY_DATA_SETS, "Image Ready Data Sets");
        _tagNameMap.put(TAG_IMAGE_READY_SELECTED_STATE, "Image Ready Selected State");
        _tagNameMap.put(TAG_IMAGE_READY_7_ROLLOVER, "Image Ready 7 Rollover Expanded State");
        _tagNameMap.put(TAG_IMAGE_READY_ROLLOVER, "Image Ready Rollover Expanded State");
        _tagNameMap.put(TAG_IMAGE_READY_SAVE_LAYER_SETTINGS, "Image Ready Save Layer Settings");
        _tagNameMap.put(TAG_IMAGE_READY_VERSION, "Image Ready Version");
        _tagNameMap.put(TAG_LIGHTROOM_WORKFLOW, "Lightroom Workflow");
        _tagNameMap.put(TAG_PRINT_FLAGS_INFO, "Print Flags Information");
    }

    public PhotoshopDirectory()
    {
        this.setDescriptor(new PhotoshopDescriptor(this));
    }

    @Override
    @NotNull
    public String getName()
    {
        return "Photoshop";
    }

    @Override
    @NotNull
    protected HashMap<Integer, String> getTagNameMap()
    {
        return _tagNameMap;
    }

    @Nullable
    public byte[] getThumbnailBytes()
    {
        byte[] storedBytes = getByteArray(PhotoshopDirectory.TAG_THUMBNAIL);
        if (storedBytes == null)
            storedBytes = getByteArray(PhotoshopDirectory.TAG_THUMBNAIL_OLD);
        if (storedBytes == null || storedBytes.length <= 28)
            return null;

        int thumbSize = storedBytes.length - 28;
        byte[] thumbBytes = new byte[thumbSize];
        System.arraycopy(storedBytes, 28, thumbBytes, 0, thumbSize);
        return thumbBytes;
    }
}