5

因此,我正在开发一个 Web 应用程序,以便能够更轻松地将使用 Photoshop 创建的 *.ACO 或 *.ASE 格式的调色板分发给没有这些程序的同事。我在设置基础知识方面已经走了很长一段路,但现在我完全陷入困境,唯一的原因是我无法弄清楚样本文件的结构。

这是我在文本编辑器中打开 *.ASE 文件时得到的:

ASEF          &      S w a t c h   1  RGB                   &    S w a t c h   2  RGB ?
Œ ?€  ?€        &    S w a t c h   3  RGB ?oïð?)̪>mí      &     S w a t c h   1  RGB                   &    S w a t c h   2  RGB ?
Œ ?€  ?€        &    S w a t c h   3  RGB ?oïð?)̪>mí      &     S w a t c h   1  RGB                   &    S w a t c h   2  RGB ?
Œ ?€  ?€        &    S w a t c h   3  RGB ?oïð?)̪>mí      &     S w a t c h   1  RGB                   &    S w a t c h   2  RGB ?
Œ ?€  ?€        &    S w a t c h   3  RGB ?oïð?)̪>mí  

当我在 NP++ 中打开它时,它看起来像这样: 在此处输入图像描述

我希望(并且天真地期望)该格式将采用某种可理解的 XML 结构,但显然不是......

我已经尝试研究这个主题并找到了这些来源:

http://www.nomodes.com/aco.html

http://www.selapa.net/swatches/colors/fileformats.php

http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm#50577411_31265

但老实说,能够把我的头绕起来对我来说感觉很复杂。如果任何对文件编码格式或颜色编码格式有更好了解的人对我有任何意见,我将不胜感激!

如果您想查看这些文件,请在此处下载:

https://www.dropbox.com/sh/9vo2h7ophpfc201/p7saMtxi_k

4

3 回答 3

6

您看到的是二进制文件的 ASCII 表示。在您之前共享的链接中,您将看到文件格式是二进制的。因此,让我们以此为出发点。现在打开文件并像这样读入,

$handle = fopen("temp.aco", "rb");

while (!feof($handle)) 
{ 
     $data = fread($handle, 2); 
     echo bin2hex($data)."<br/>";  
} 

这将打开 .aco 文件并读取,直到到达文件末尾。通过使用 fread 并将第二个参数设置为 2,您可以从文件中读取 2 个字节的数据。然后你会看到像这样的输出,

0001 0008 0000 fafa e2e2 dbdb 0000

现在查看您的其他链接,您将看到第一个数字 0001 代表版本号 0008 代表文件中的颜色数(在我的情况下为 8)然后您的颜色类型通常为 0000 (RGB) 0001 (HSB ) 0002 (CMYK) 其余请参阅颜色转换表。

颜色由 3 个或 4 个单词组成,因此有时您可以忽略最后一个单词,它会被归零。所以让我们看一个例子,

0000-(RGB Type) fafa-(红色代表0..65535范围) e2e2-(绿色代表0..65535范围) dbdb-(蓝色代表0..65535范围) 0000-(这里不需要数据定位为零)

通过将读取的单词转换为无符号整数并遵循转换表,您将获得适当的 rgb 值。这是我解析各种类型的代码。

function colorInColorSpace($colorSpace, $w, $x, $y, $z){

// RGB
if($colorSpace==0){
    $r = $w/256;
    $g = $x/256;
    $b = $y/256;
    //z component not used in rgb format
    print $colorSpace." ".$r." ".$g." ".$b."<br/>";
}
//HSB
else if($colorSpace==1){
    $h = $w/182.04;
    $s = $x/655.35;
    $b = $y/655.35;

    print $colorSpace." ".$h." ".$s." ".$b."<br/>";
}
//CYMK
else if($colorSpace==2){
    $c = 100 - ($w/655.35);
    $m = 100 - ($x/655.35);
    $y = 100 - ($y/655.35);
    $k = 100 - ($z/655.35);

    print $colorSpace." ".$c." ".$m." ".$y." ".$k."<br/>";
}
//Lab
else if($colorSpace==7){
    // print $colorSpace." ".bin2hex($w[0])." ".bin2hex($w[1])."<br/>";
}
//Grayscale
else if($colorSpace==8){
    $greyscale = $w/39.0625;
    print $colorSpace." ".$greyscale."<br/>";
}
//Wide CYMK
else if($colorSpace==9){
    $c = $w/100;
    $m = $x/100;
    $y = $y/100;
    $k = $z/100;

    print $colorSpace." ".$c." ".$m." ".$y." ".$k."<br/>";
}

}

希望这可以帮助。

于 2013-08-16T23:17:01.587 回答
2

仅供参考,我遇到了类似的问题,发现了这个读取ACO文件并将它们转换为html的C程序。http://www.hping.org/aco2html/

这是一个很棒的工具,但是因为我想修改它并让它变得更好,所以我决定将它移植到 JavaScript。这是我在 Github 上的代码https://github.com/websemantics/Color-Palette-Toolkit

还有现场演示

http://websemantics.github.io/Color-Palette-Toolkit/

于 2015-01-04T18:13:58.170 回答
1

在我寻找解码 Adob​​e 的 .ASE 样本格式的方法时偶然发现了这篇文章。我不确定它是否对您有帮助。ACO,但我发现一个人写了一个从 .ASE 格式中提取颜色的类:

Adobe Swatch Exchange 阅读器/解码器!断开的链接

于 2013-09-05T01:35:40.660 回答