Photo by Denise Chan on Unsplash

Mastering Adobe Color File Formats

Marc Auberer
The Startup
Published in
6 min readJan 1, 2021

--

The Adobe Software Suite has several software representatives, which make use of color swatch palettes. Those palettes can be customized and amongst other things also can be imported and exported. For this purpose, Adobe offers three different file formats to store color swatch palettes: ACO (Adobe Color), ASE (Adobe Swatch Exchange) and ACT (Adobe Color Table). This article will have focus on ACO and ASE, which are the most commonly used formats.

I recently built an Android library for importing / exporting ACO / ASE files for Android applications (more about this later on). This required a bit of research work and I decided to share the gained knowledge, bundled in this article to save you the effort and time of research.

The ACO color format

ACO is a binary file format, that originally was designed to export custom color swatch palettes from Adobe Photoshop due to backup reasons or to cross-use them with other Photoshop versions. The original implementation of protocol version 1 (V1) only provides support for storing the raw color values without names. It works with 16-Bit words and consists of a 2-word header and several 5-word color blocks.

Later on, Adobe introduced protocol version 2 (V2), which allows to store color values in combination with associated designations. To ensure backward compatibility, files with protocol version 2 start with the V1 header and V1 color blocks. Older versions of Adobe Photoshop will stop reading at this point while Photoshop versions, supporting V2 will continue to read the V2 header and V2 color blocks. This color blocks also include the associated color names. According to this change, V2 color blocks have a dynamic length, due to containing the color name with its variable length.

The image below shows the structure of an ACO color file with following example data:

  • Name: ad0d34, color value: #AD0D34 (RGB: 173, 13, 52)
  • Name: c77a31, color value: #C77A31 (RGB: 199, 122, 49)
  • Name: f10f6b, color value: #F10F6B (RGB: 241, 15, 107)

The ACO binary outcome looks like this (Hex for better readability):

[ 0x00 0x01 0x00 0x03 0x00 0x00 0xAD 0xAD 0x0D 0x0D 0x34 0x34 0x00 0x00 0x00 0x00 0xC7 0xC7 0x7A 0x7A 0x31 0x31 0x00 0x00 0x00 0x00 0xF1 0xF1 0x0F 0x0F 0x6B 0x6B 0x00 0x00 0x00 0x02 0x00 0x03 0x00 0x00 0xAD 0xAD 0x0D 0x0D 0x34 0x34 0x00 0x00 0x00 0x00 0x00 0x07 0x00 0x61 0x00 0x64 0x00 0x30 0x00 0x64 0x00 0x33 0x00 0x34 0x00 0x00 0x00 0x00 0xC7 0xC7 0x7A 0x7A 0x31 0x31 0x00 0x00 0x00 0x00 0x00 0x07 0x00 0x63 0x00 0x37 0x00 0x37 0x00 0x61 0x00 0x33 0x00 0x31 0x00 0x00 0x00 0x00 0xF1 0xF1 0x0F 0x0F 0x6B 0x6B 0x00 0x00 0x00 0x00 0x00 0x07 0x00 0x66 0x00 0x31 0x00 0x30 0x00 0x66 0x00 0x36 0x00 0x62 0x00 0x00 ]

Let’s further analyze the file to see what conclusions we can draw from this:

Detailed visualization of the ACO format

The ASE color format

ASE stands for Adobe Swatch Exchange and like the name implies, is primarily used to exchange swatch palettes between different Adobe products like Adobe Photoshop and Adobe Illustrator. Like the ACO format, ASE comes as binary, but instead of using fixed sized 16-Bit words, it has a dynamic word length. The ASE format contains a 3-word file header, followed by several data blocks. Note that there are three types of data blocks: Group start, Group end and Color entry. Those block types differ by their number of fields and their respective length. Group start blocks consist of the type identifier, the block length, the name length and the name itself. Group end bocks contain only the type identifier and the block length, which always is 0 per definition. Lastly, the Color entry blocks also has the type identifier, the block length, the name length and the name, but also holds the additional fields of color space (CMYK, RGB, Lab, Gray), the color value fields and the color mode. The number of color value fields is dependent on the color space and how many variables the chosen color space needs.

A file in ASE coding looks like this (Hex for better readability):

[ 0x41 0x53 0x45 0x46 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x05 0xC0 0x01 0x00 0x00 0x00 0x16 0x00 0x0A 0x00 0x49 0x00 0x6D 0x00 0x61 0x00 0x67 0x00 0x69 0x00 0x6E 0x00 0x61 0x00 0x72 0x00 0x79 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x22 0x00 0x07 0x00 0x61 0x00 0x64 0x00 0x30 0x00 0x64 0x00 0x33 0x00 0x34 0x00 0x00 0x52 0x47 0x42 0x20 0x3F 0x2D 0xAD 0xAE 0x3D 0x50 0xD0 0xD1 0x3E 0x50 0xD0 0xD1 0x00 0x02 0x00 0x01 0x00 0x00 0x00 0x22 0x00 0x07 0x00 0x63 0x00 0x37 0x00 0x37 0x00 0x61 0x00 0x33 0x00 0x31 0x00 0x00 0x52 0x47 0x42 0x20 0x3F 0x47 0xC7 0xC8 0x3E 0xF4 0xF4 0xF5 0x3E 0x44 0xC4 0xC5 0x00 0x02 0x00 0x01 0x00 0x00 0x00 0x22 0x00 0x07 0x00 0x66 0x00 0x31 0x00 0x30 0x00 0x66 0x00 0x36 0x00 0x62 0x00 0x00 0x52 0x47 0x42 0x20 0x3F 0x71 0xF1 0xF2 0x3D 0x70 0xF0 0xF1 0x3E 0xD6 0xD6 0xD7 0x00 0x02 0xC0 0x02 0x00 0x00 0x00 0x00 ]

Formatted, colored and labeled we can see how the gist looks like:

Detailed visualization of the ASE format

Adobe Color Tool: Export / import colors in Android

As mentioned above, I’ve implemented an Android library for importing and exporting color lists to ACO / ASE files. To use it in your project, you first have to add it to your dependency list in your build.gradle file at module level:

implementation 'com.chillibits:adobecolortool:1.0.4'

If you want to use the library for exporting colors, you also need to define a ContentProvider similar to this one in your Android Manifest:

<application>
<!-- ... -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.chillibits.adobecolorsample"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>

Remember to replace com.chillibits.adobecolorsample with your package name.

Furthermore, please create the following file in your res/xml/file_paths.xml directory to specify the file path rules of the file provider:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path path="/" name="allfiles" />
</paths>

Export colors

The colors have to be provided as variable of the type List<AdobeColor>.
This list of colors can then be exported in ACO format like this:

val colors = listOf(
AdobeColor(Color.rgb(173, 13, 52), "ad0d34"),
AdobeColor(Color.rgb(199, 122, 49), "c77a31"),
AdobeColor(Color.rgb(241, 15, 107), "f10f6b")
)
AdobeColorTool(this).exportColorListAsACO(colors)

Note: Before you call the exportColorListAsACO function, you have to request the WRITE_EXTERNAL_STORAGE permission first. Otherwise, the app will crash with an error.

ASE can be exported with this method call:

AdobeColorTool(this).exportColorListAsASE(colors)

Both methods can also be called with a second parameter of type String to define a name for your color palette. This name will be set as file name for the respective output file and will also be applied to act as the ASE group name.

Import colors

You can call the importColorList method to bring up a dialog for picking a single ACO or ASE file.

AdobeColorTool(this).importColorList(this, object: AdobeColorTool.AdobeImportListener {
override fun onComplete(colors: List<AdobeColor>) {
/* Your code */
}

override fun onCancel() {
/* Your code */
}
})

The selected file will automatically be analyzed, whether it is a ACO or ASE file and you get back a object of type Map<String, List<AdobeColor>> in the onComplete callback method. The map will contain key value pairs, which represents all imported color groups. The key is the group name and the value is a list of type AdobeColor with the actual color values. An import of the ACO format will result in a single color group with the name ACO Import, containing all color values.

Thanks for reading this article, I hope you’ve learned something from it.

To get more information about this topic, please visit the Adobe Color Tool project on GitHub. There can also be found links to further information sources. If you miss a feature in the library or you want to add the support for another framework, feel free to send me your contribution on GitHub.

--

--

Marc Auberer
The Startup

C++ Compiler Developer at SAP. Passionate software developer and OpenSource enthusiast.